C返回重复字符数

时间:2019-06-15 08:11:15

标签: c arrays string

我正在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作为可见char数组的大小?字母表中有26个字母,这个人已经在while循环中将这些字符转换为小写,因此我认为您也不必担心它是大写。

2)此行

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

我知道它正在检查字符串中的当前字符是否在看到的数组中,但是如何?我所说的语法对我来说没有意义。

谢谢大家的时间。我本打算将其发布在代码审查中,但有人告诉我它实际上不是“如何”网站。

1 个答案:

答案 0 :(得分:1)

  

1)为什么使用127作为可见char数组的大小?

不清楚。 char可能已签名或未签名。对于带符号的字符,最大值(假设为8位字符)可以为127。在这种情况下,数组应为seen[128]
ASCII 127 → Delete character可能被认为是特殊的,因此预计不会发生...

  

2)

该行:

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

也可以写成:

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

它利用后增量的效果,后增量返回旧值,然后再应用其效果(增量)。

对于duplicates++,返回的旧值未使用。 因此,++duplicatesduplicates++的影响可以忽略不计。