C возвращает количество повторяющихся символов - PullRequest
0 голосов
/ 15 июня 2019

Я выполнял задачу кодирования на codewars.com, и задача состояла в том, чтобы взять строку в качестве входных данных, проверить ее на наличие дублирующих символов и вернуть количество дублированных символов. Можно предположить, что все символы будут только буквами.

Так или иначе, я получил свой код и отправил его, после чего я увидел этот код на той же проблеме в месте номер 1, codewars.com позволяет увидеть, как другие люди решили эту проблему.

Вот оно,

size_t duplicate_count(const char* text)
{
    char seen[127] = { 0 };
    size_t duplicates = 0;
    char c;

    while ((c = *text++))
    {
        if (seen[tolower(c)]++ == 1) duplicates++;
    }

    return duplicates;
}

Есть несколько вещей, которые я не понимаю в этом коде, хотя я уверен, что он довольно прост.

1) Зачем использовать 127 в качестве размера видимого массива символов? В алфавите 26 букв, и этот человек уже переводит символы в нижний регистр в цикле while, поэтому я не думаю, что вам все равно придется беспокоиться о том, что он в верхнем регистре.

2) эта строка

if (seen[tolower(c)]++ == 1) duplicates++;

Я понял, что он проверяет, находится ли текущий символ в строке в видимом массиве, но как? Синтаксис не имеет смысла для меня, это то, что я говорю.

Спасибо всем за ваше время. Вместо этого я собирался опубликовать это в обзоре кода, но мне сказали, что это не совсем «как» сайт.

1 Ответ

1 голос
/ 15 июня 2019

1) Зачем использовать 127 в качестве размера видимого массива символов?

Нет ясной идеи. char может быть подписано или не подписано. В случае знаков со знаком самое высокое значение (при условии 8-битных символов) может быть 127. В этом случае массив должен быть seen[128].
ASCII 127 & rarr; Удаление символа может считаться специальным и, следовательно, не ожидается ...

2)

Строка:

if (seen[tolower(c)]++ == 1) duplicates++;

также можно записать как:

char cLower = tolower(c);
int seenOld = seen[cLower];
++seen[cLower];
if (seenOld == 1) ++duplicates;

Используется эффект постинкремента, который возвращает старое значение и впоследствии применяет его эффект (инкремент).

В случае duplicates++ возвращенное старое значение не используется. Следовательно, эффект ++duplicates против duplicates++ пренебрежимо мал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...