今天查YBT1407题解 发现有些地方不是很懂
【某博主题解】
#include
using namespace std;
string word;
int maxn,minn=999999999,a[10001];
bool check(int n)
{
if(n<2)return false;
for(int i=2;i<=floor(sqrt(n));i++)
{
if(n%i==0)return false;
}
return true;
}
int main()
{
cin>>word;
for(int i=0;i
for(int i=0;i<26;i++)
{
if(maxn
if(minn>a[i]&&a[i]!=0)minn=a[i];
}
if(check(maxn-minn))cout<<"Lucky Word\n"<
else cout<<"No Answer\n"<<0;
return 0;
}
按题解代码写当然是对的
然而最让我不解的是这个“a[word[i]-'a']++;” 统计各字母出现次数我知道 但为什么这样写?
我很想知道==
a[word[i]-'a']++
这里word数组的元素是'a'-'z',a数组是统计这些字符的个数
word[i] - 'a',结果就是0-25,而a[0]就表示'a'字符的个数,a[25]表示'z'字符个数。所以a[word[i]-'a']++就是给word[i]字符的统计数量加1
a[word[i]-'a']++
word[i]是当前遍历到的字母,减去‘a'对应了这个字母对应数组的下标。比如a对应了数组的word[0] b对应了word[1] 如果找到了对应的字母则让数组对应下标的值加1,最后就得到了每个字母出现的次数。
但是这样也有问题。如果是非法输入的话会造成越界的问题。比如输入了大写的A 则-'a'出现负数。数组产生负数下标就可能出现越界导致内存泄露。