【问题标题】:How to delete duplicated values in array in C?如何删除C中数组中的重复值?
【发布时间】:2014-07-15 06:25:49
【问题描述】:

我想删除数组中的重复值。例如:array[1,5,6,1,3,5,9] 我想要array[6,3, 9].
我已经写了这个,但是我遇到了麻烦:

#include<stdio.h>
main() {
    int array[50], i, j, k=0, c=0, array2[50], n;
    printf("Enter array dimension: "); scanf("%d", &n);
    for (i = 0; i < n; i++) {
        printf("array[%d]= ", i); scanf("%d", &array[i]);
    }
    for (i = 0; i < n; ) {
        for (j = i + 1; j < n; j++) {
            if (array[i] == array[j])
                i++;
            else {
                array2[k++] = array[i];
                c++;
            }
        }
    }
    for (k = 0; k < c; k++) {
        printf("%d  ", array2[k]);
    }
    system("pause");
}

【问题讨论】:

  • 您没有在第一个 for 循环中增加 i。如果array[i] == array[j] 没有发生,i 将永远保持不变。此外,kc 似乎具有相同的值,去掉其中一个。数字范围有限制吗?你对性能有任何限制(大 O),或者O(n*n) 可以接受吗?
  • 我想这将是一个小数组,10 - 15 个元素。我知道,我正在无限循环。我该如何改变呢?谢谢
  • 您的循环永远不会终止,因为正如我在上面所写的,您不会在所有情况下增加i。尝试调试(一步一步,使用你最喜欢的调试器)输入数组为[1,2,3]的情况。
  • 人们在哪里学习写作main()??说真的,自 90 年代的某个时候以来,没有参数的 main 已被弃用/过时/不好的做法。人们还在使用早期的 K&R,或者阅读 C++ 书籍,还是什么?这是 2014 年。在 C 语言中,主函数要么接受两个参数,要么接受 void。它不是可变参数函数!
  • 我是学生,几年前我已经开始学习 C。所以,如果你能帮助我,请帮助我。

标签: c arrays duplicate-removal


【解决方案1】:

您应该首先用伪代码描述您的问题,然后将其分解成更小的部分。

从头开始删除所有这些冗余变量,并尝试实现以下算法:

for each element in inputArray
   if not elementIsDuplicate(element)
      add to outputArray

这是一个 for 循环。 elementIsDuplicate 是单独的函数。

现在尝试实现函数elementIsDuplicate。此函数还包含一个循环,接受输入参数 (int* array, int n, int currentIdx) 并返回 10 指示 currentIdx 处的元素是否出现在数组中的其他任何位置。

【讨论】:

  • 好的,但是如何检查元素是否重复?我试过两个循环,内循环正在检查数字是否与外循环中的数字相同。如果是真的,我想跳过那个号码,然后检查其他号码。如果外循环中的数字与内循环中的数字不同,我想将其添加到输出数组中。这就是这个问题的逻辑。谢谢
  • 在单独的函数 (elementIsDuplicate) 中包含这个逻辑会更简单,它只会检查单个 index 是否在其他地方重复。对于数组中的每个元素,如果索引不等于当前索引,则检查元素是否等于当前索引处的元素。
  • 这似乎是正确的方法,您需要做的就是在函数中分别发送每个索引,然后检查整个矩阵是否重复。
【解决方案2】:
#include<stdio.h>

int main(){
    int array[50], i, j, k=0, c, n, array2[50] = {0};
    printf("Enter array dimension: "); scanf("%d", &n);
    for (i = 0; i < n; ++i){
        int num, dup = 0;
        printf("array[%d]= ", i); scanf("%d", &num);
        for(j = 0; j < k; ++j){
            if(array[j] == num){
                array2[j] = dup = 1;
                break;
            }
        }
        if(!dup){
            array[k++] = num;
        }
    }

    for (c=i=0; i < k; ++i){
        if(!array2[i])
            printf("%d ", array[c++] = array[i]);
    }
    printf("\n");
/*
    for(i=0;i<c;++i)
        printf("%d ", array[i]);
    printf("\n");
*/
    system("pause");
    return 0;
}

【讨论】:

  • array[c++] = array[i]printf,现在这是 OP 真正需要向他的老师解释的设计选择。 :)
【解决方案3】:
#include<stdio.h>
main()
{
int n, a[50], b[50], count = 0, c, d;

printf("Enter number of elements in array\n");
scanf("%d",&n);

printf("Enter %d integers\n", n);
for(c=0;c<n;c++)
    scanf("%d",&a[c]);       //enter array elements

for(c=0;c<n;c++)
{
    for(d=0;d<count;d++)
    {
        if(a[c]==b[d])
            break;
    }
    if(d==count)
    {
        b[count] = a[c];
        count++;
    }
}
printf("count is: %d\n",count);
printf("Array obtained after removing duplicate elements\n");
for(c=0;c<count;c++)
    printf("%d\n",b[c]);
return 0;
}

这将从所需的数组中删除多个重复项.. 示例:如果输入数组为:3 6 5 6 2 8 6 5 9 8 6,则输出数组为:3 6 5 2 8 9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-24
    • 2012-06-05
    • 2011-08-05
    • 2018-02-13
    • 2010-09-05
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多