从数组中删除重复项的算法不起作用

时间:2014-11-04 13:36:12

标签: c++ arrays algorithm

我有一个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

我试图在论文上运行这个算法,但是当我这样做时,似乎没问题,但它在我的应用程序中不起作用。

5 个答案:

答案 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时停止。