【问题标题】:arranging the numbers with duplicate entries deleted排列删除重复条目的数字
【发布时间】:2014-09-24 16:13:25
【问题描述】:
#include<stdio.h>
int main(){
int a[9],i,j,r,t,min,c=0;
for(r=0;r<9;r++)
    scanf("%d",&a[r]);

for (j=0;j<9;j++) {
    min=a[j];
    for(i=j;i<9;i++) {
        if(a[i] <  min ) {
            c=i;
            min=a[i];
        }
    }
t=a[j];
a[j]=min;
a[c]=t;
}

for(r=0;r<9;r++)
    printf("%d",a[r]);
}

这是我必须按升序排列用户输入的数字的代码。 如果输入为 1 2 3 2 4 1 5 6 3 输出为 1 1 2 2 3 3 4 5 6 但我希望输出为 1 2 3 4 5 6 即删除重复条目。请帮助我。

【问题讨论】:

  • 你应该关心的第一件事:代码缩进
  • 然后排序,然后一次选择多个。
  • 提示:如果我只是打印了这个号码,就不需要再打印了。
  • 先对数组进行排序,然后删除重复的条目。
  • @KhairulBasar ,OP 已经对他的数组进行了排序。他想删除其中的重复值。

标签: c algorithm sorting data-structures


【解决方案1】:

如果给出了数字的范围,那么您可以使用一个布尔数组来做到这一点,该数组会将1 存储到元素的相应索引中。

#include <stdio.h>
#include <stdbool.h>
#define NUM_RANGE 10

int main(){
    int num;
    bool freq[NUM_RANGE + 1] = {0};
    for(int r = 0; r < 9; r++){
         scanf("%d",&num);
         freq[num] = 1;
    }

    for (int i = 0; i < NUM_RANGE + 1; i++)
         if(freq[i])
             printf("%d ", i);

}

【讨论】:

    【解决方案2】:
    #include<stdio.h>
    
    int main(){
        int a[] = {1, 2, 3, 2, 4, 1, 5, 6, 3};
        int n = sizeof(a)/sizeof(*a);
        int i, j, t;
    
        for (j=0;j<n-1;j++){
            for(i=j+1;i<n;){
                if(a[i] == a[j]){
                    t = a[i];
                    a[i] = a[--n];
                    a[n] = t;
                    continue;
                }
                if(a[i] < a[j]){
                    t = a[i];
                    a[i] = a[j];
                    a[j] = t;
                }
                ++i;
            }
        }
        for(i=0;i<n;i++)
            printf("%d ", a[i]);
        return 0;
    
    }
    

    【讨论】:

      【解决方案3】:

      所以,这是您可以遵循的程序。

      1. 您对数组进行排序(正如您已经完成的那样)。您的排序算法具有 O(n^2) 最坏情况运行时间,其中 n 是数组中元素的数量。如果你关心运行时间,可以达到的最佳运行时间是 O(n logn) [MergeSort]。

      2. 接下来,我们需要找到重复项并将其删除。 由于您已经订购了它们,因此只需遍历您的数组并检查每个数字 a[i] 和下一个数字 a[i+1] 是否不同。如果不是,请将其删除并通过将数组的所有其余部分向前移动一个来填充空白空间。

      所以:

      for(i = 0; i < 9; i++){
      
         if(a[i] == a[i+1]){
            deletNumber(i); //deletes number at position i in the array and shifts the   
                            //rest of the array so the empty space is filled.
         }
      }
      
      void deleteNumber(int i){
        int j; 
      
        for(j = i; j<8; j++){
      
          a[j] = a[j++];  
        }
      }
      

      【讨论】:

      • 你对你的陈述有解释吗?
      • 它具有二次时间复杂度(即错误),并调用未定义的行为(即错误)。
      • 我同意你关于二次时间复杂度的第一点,但问题并没有要求任何特定的时间复杂度。关于未定义的行为,我不完全理解您的意思,但欢迎您编辑我的答案并纠正错误。
      猜你喜欢
      • 2014-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 2023-03-15
      • 2016-05-22
      • 2021-01-22
      • 1970-01-01
      相关资源
      最近更新 更多