我正在开发一个程序,通过对数组进行排序然后删除重复的连续值来从数组中删除重复值。首先,我执行选择排序排序方法,然后调用修改数组并返回大小的函数removedup()
。然后我基本上将数组中的值打印到该大小。但是,当我执行它时,它只打印原始数组,然后打印一堆空格。有谁知道为什么会这样?
我的代码:http://pastebin.com/uTTnnMHN
只是重复数据删除代码:
int removedup(int a[])
{
int i, count, j;
count = n;
for (i = 0; i < (n - 1); i++) {
if (a[i] == a[i + 1]) {
for (j = 0; j < (n - i); j++) {
a[j] = a[j + 1];
}
count--;
i--;
}
}
return count;
}
答案 0 :(得分:2)
-1表示(j = 0; j&lt;(n-i); j ++)
你的循环是否向左移动你的数组(从而删除了重复的值),j不应该是init到j而是i,并且条件似乎不正确
正确的可能是:
for(j=i;j<n-1;j++)
{
a[j]=a[j+1];
}
a[n-1] = 0; // Because you shift your table to the left, the last value should not be used
答案 1 :(得分:1)
首先如果i = 0并且如果a [i] == a [i + 1]那么i = -1
for(i=0;i<(n-1);i++)
{
if(a[i]==a[i+1])
{
for(j=0;j<(n-i);j++)
{
a[j]=a[j+1];
}
count--;
i--; //i=-1 if(a[i]==a[i+1]) && if(i==0)
}
}
答案 2 :(得分:1)
在你的重复删除功能中,你需要在i
开始移动循环,如前所述,你必须使用count - 1
作为两个循环的循环绑定,否则你将拥有每当有重复时,无限循环,因为a[n-2] == a[n-1]
总是在第一个移动循环之后。
int removedup(int a[])
{
int i, count, j;
count = n;
for(i = 0; i < (count-1); i++)
{
if(a[i] == a[i+1])
{
for(j = i; j < (count-1); j++)
{
a[j]=a[j+1];
}
count--;
i--;
}
}
return count;
}
正常工作。
答案 3 :(得分:0)
既然您正在创建另一个阵列,为什么不简化您的功能呢?
int removedup(int a[], int b[])
{
int i;
int count = 1;
b[0] = a[0]
for(i=1;i<(n-1);i++){
if(a[i-1] != a[i]){
b[count++] = a[i];
}
}
return count;
}
然后当你调用该函数时,
count=removedup(a, OutArray);
答案 4 :(得分:0)
int removedup(int a[])
{
int i;
count = n;
for (i = 0; i < (count-1); ++i) {
if (a[i] == a[i+1]) { /* found a duplicate */
int d = 0; /* count the duplicates */
do {
++d;
} while ((i+1+d) < count && a[i] == a[i+1+d]); /* probe ahead again for a duplicate */
/* at this point we have either run out of duplicates or hit the end of the array */
if ((i+1+d) < count)
memmove(&a[i+1], &a[i+1+d], sizeof(int)*(count-(i+1+d))); /* shift down rest of the array if there's still elements to look at */
count -= d; /* adjust the count down by the number of duplicates */
}
}
return count;
}
答案 5 :(得分:0)
这个怎么样,没有排序但是遍历。最后打印数组的有效值并返回它的大小。
int removedup(int a[])
{
int i, count, j;
count = n;
int b[n];
memset(b,0,sizeof(b));
for (i = 0; i < (n - 1); i++)
{
if (-1 != b[i])
{
for(j=i+1;j<n-1;j++)
{
if( a[i]==a[j])
{
b[j]=-1;
count--;
}
}
}
}
for(i=0;i<n-1;i++)
{
if(-1 != b[i])
{
printf("%d ",a[i]);
}
}
return count;
}