我正在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++;
我知道它正在检查字符串中的当前字符是否在看到的数组中,但是如何?我所说的语法对我来说没有意义。
谢谢大家的时间。我本打算将其发布在代码审查中,但有人告诉我它实际上不是“如何”网站。
答案 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++
,返回的旧值未使用。
因此,++duplicates
与duplicates++
的影响可以忽略不计。