我有以下代码,其中对于唯一的检查部分无论输入我说它都是唯一的字符。在案例2中,我是否有任何逻辑错过的东西?
***case 2: {
{
for(int i=0;i<counter;i++)
for(int j=1;j<counter;j++) //I THINK THIS US WHERE SOME THING WENT WRONG
{ // LOGICALLY. WHAT IS THAT THAT HAS TO BE
//CHANGED.
if(array[i] == array[j]) { flag == 1; }
else flag = 0;
}
}
if(flag == 1) { cout<<"\n All characters in the sentence are not unique"; }
else if(flag == 0) { cout<<"All are unique characters"; }
};break;***
}
答案 0 :(得分:1)
有两件事是错的,首先是: flag == 1是比较,而不是赋值,因此在您的情况下,您的标志永远不会设置为1。 其次,j不应该从1开始,而是从i + 1开始。
在旁注中,您使用每个检查设置标志,因此基本上您只检查最后一个比较。 当你发现一个角色不是唯一的时候,你可能想早点离开你的圈子。
答案 1 :(得分:0)
有两件事是错的:
首先我认为内循环应该是
for (int j=i+i; j<counter; j++)
否则,假设i = 2,你会将数组[2]与自身进行比较(如果j和i都是2)
另外,关于标志,每当你找到不同的字符时都不应该将它设置为0(省略else
子句),因为在某处找不同的字符并不意味着重置你的标志'见过平等的人。而是在第一个循环之前设置flag= 0
。
编辑:而且,正如其他人所指出的那样,设置标志是用“=”而不是“==”完成的,所以我们至少有三个错误。
答案 2 :(得分:0)
if
条件应为(i!=j && array[i]==array[j])
,flag == 1
不是作业,而是比较,应更改为flag = 1
。
您可以开始计算if
j
,而不是更改i+1
条件。我对重写代码的建议看起来像这样
bool flag = false;
for(int i=0; i<counter && !flag; ++i)
{
for(int j=i+1; j<counter; ++j)
{
if( array[i] == array[j] )
{
flag = true;
break; // exits the inner for loop only.
}
}
}
cout << flag ? "\n All characters in the sentence are not unique" :
"All are unique characters";
break; // exits switch statement.
答案 3 :(得分:0)
如前所述,您在代码中有几处错误,
flag = 1
i!=j && array[i] == array[j]
但理想情况下,这种独特的字符检查不是最优化的解决方案。您需要一个大小为255的int数组,其所有内容都初始化为零。对于遇到的每个字符,转到ASCII值位置并将值递增1.完成此操作后,如果存在任何值不是0或1的成员,则交叉检查数组。如果遇到,则在字符串中存在重复!