首页 > 解决方案 > C 返回重复字符的个数

问题描述

我在 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作为seen char数组的大小?字母表中有 26 个字母,这个人已经在 while 循环中将字符转换为小写,所以我认为你不必担心它是大写的。

2)这条线

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

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

谢谢大家的时间。我本来打算在代码审查上发布这个,但有人告诉我这不是一个真正的“如何”网站。

标签: carraysstring

解决方案


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

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

2)

该行:

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

也可以写成:

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

它利用后增量的效果返回旧值并在之后应用其效果(增量)。

在 的情况下duplicates++,返回的旧值未被使用。因此,++duplicatesvs . 的影响duplicates++可以忽略不计。


推荐阅读