1

我有我的以下代码,其中对于唯一检查部分我给出的任何输入都是唯一字符。在案例 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;***        
}
4

4 回答 4

1

有两件事是错误的,首先: flag == 1 是一个比较,而不是一个赋值,所以你的标志永远不会被设置为 1 在你的情况下。其次,j不应该从1开始,而是从i+1开始。

附带说明一下,您在每次检查时都设置了标志,因此基本上您只检查最后一次比较。当您发现一个角色不是唯一的时,您可能希望尽早退出循环。

于 2013-06-10T09:19:01.927 回答
0

有两点不对:

首先我认为内循环应该是

for (int j=i+i; j<counter; j++)

否则,假设在 i=2 的情况下,您将 array[2] 与自身进行比较(如果 j 和 i 都是 2)

此外,关于标志,当您发现不同的字符时,不应将其设置回 0(省略else子句),因为在某处找到不同的字符并不意味着重置您看到的相同标志。而是flag= 0在第一个循环之前设置。

编辑:而且,正如其他人指出的那样,设置标志是用“=”而不是“==”完成的,所以我们至少有三个错误。

于 2013-06-10T09:20:47.490 回答
0

if条件应该是并且不是赋值而是比较(i!=j && array[i]==array[j])并且flag == 1应该更改为flag = 1

if您也可以开始计算jat ,而不是更改条件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.
于 2013-06-10T09:20:53.420 回答
0

正如已经回答的那样,您的代码中有几个错误,

  1. flag = 1
  2. 检查条件...... i!=j && array[i] == array[j]

但理想情况下,这种独特的字符检查并不是最优化的解决方案。您需要一个大小为 255 的 int 数组,其所有内容都初始化为零。对于遇到的每个字符,转到 ASCII 值位置并将值加 1。完成后,交叉检查数组中是否存在值不是 0 或 1 的任何成员。如果遇到字符串中存在重复项!

于 2013-06-10T09:34:32.510 回答