我有一个char数组,它有一些重复的值:
A B C D E F E A
这是我删除重复值的算法:
char array[20] = {'A', 'B', 'C', 'D', 'E', 'F', 'E', 'A'};
int length = 8;
for (int i = 0; i < length; i++)
{
for (int j = i + 1; j < length - 1; j++)
{
if (array[i] == array[j])
{
array[j] = array[j + 1];
length--;
}
}
}
EXPECTED OUTPUT: A B C D E F
OUTPUT: A B C D E F A
我试图在论文上运行这个算法,但是当我这样做时,似乎没问题,但它在我的应用程序中不起作用。
答案 0 :(得分:1)
j < length
允许[j + 1]
超越
随着元素的移动,length
不再是有效数据的长度。 counter
可能是,但您不会显示有关如何初始化的代码。
编辑问题以使用length--
代替counter--
,但错误是将j
一直推进到包含j + 1
的内部循环中的结尾。因为内部循环将jet设置为i
length
一直延伸到外部循环中的i + 1
。
答案 1 :(得分:1)
您有未定义的行为。
在外循环的第一次迭代(i = 0)和内循环的最后一次迭代(j = 7,其中length = 8),array[i] == array[j]
为真,因为两者都是&#39; A& #39 ;.但是你可以访问超出界限的array[j+1]
。
然后,当i = 4且j = 6时,你将值复制到7(现在用垃圾覆盖了,但显然恰好是你的情况下的A&#39;)到索引6,给出你看到错误的结果。
您需要在j < (length - 1)
条件下复制元素以避免UB。那么你至少应该在这个例子中得到正确的结果。
答案 2 :(得分:1)
虽然我知道它并没有直接解决问题,但是这里有更好的代码替代方法可以避免这些问题(需要C ++ 11进行向量初始化):
std::vector<char> in{'A', 'B', 'C', 'D', 'E', 'F', 'E', 'A'};
std::vector<char> out;
std::sort (in.begin(),in.end());
std::unique_copy(in.begin(), in.end(), std::back_inserter(out));
如果您不需要副本,也可以使用std::unique
代替std::unique_copy
。
答案 3 :(得分:1)
你应该在if语句中添加另一个for循环 检查以下代码:
char array[20] = {'A', 'B', 'C', 'D', 'E', 'F', 'E', 'A'};
int length = 8;
for(int i = 0; i <= length; i++){
for(int j = i+1; j <= length; j++){
if(array[j] == array[i]){
for(int x = j+1; x <=length; x++){
array[j]=array[x];
}
length--;
}
}
}
for(int z = 0; z <= length; z++){
cout << array[z] << " ";
}
cout << endl;
答案 4 :(得分:0)
它只适用于i = 0到3.
当i = 4时,数组[4] ='E',数组[j] ='F',它通过。 J ++ 当i = 4时,array [4] ='E',array [j] ='E',array [j]设置为array [j + 1],即'A'。
移位工作正常但是i的循环可能是数组的整个长度而不是更改长度,因为它在i = 5时停止。