c - 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++;
我知道它正在检查字符串中的当前字符是否在所见数组中,但是如何?语法对我来说没有意义就是我所说的。
谢谢大家的时间。我本来打算在代码审查上发布这个,但有人告诉我这不是一个真正的“如何”网站。
解决方案
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++
,返回的旧值未被使用。因此,++duplicates
vs . 的影响duplicates++
可以忽略不计。
推荐阅读
- git - 错误:无法生成 C:/Windows/system/32/OpenSSH/ssh.exe
- javascript - 如何通过单击孵化器 eCharts 中的轴标签刻度来切换整个组?
- java - 如何使用 PDFBox 从 PDF 文档中删除链接
- git - 在执行“git submodule add...”时,如何获取有关两个项目的结帐版本的信息?
- python-3.x - 从 pandas 数据框中另一列中的值创建变量
- java - 如何将sql本机查询结果映射到spring jpa存储库中的DTO?
- reactjs - Reactjs 和 Yup,react-hook-form 集成的问题
- image - 如何在 React Native Expo 中切片图像?
- php - 使用 Json Decoded 字符串执行 php select 以使用数学问题中的字符串,然后更新我的数据库
- javascript - JavaScript 中的 MIME 类型问题