【问题标题】:C - delete element from array and reorganiseC - 从数组中删除元素并重新组织
【发布时间】:2019-03-16 09:54:02
【问题描述】:

给定这个数组:

int a[] = {5, 8, 5, 6, 9, 5};

是否可以删除所有等于 5 的整数并将其余整数移到数组的前面?

这样删除后的数组将如下所示:

int a[] = {8, 6, 9, 0, 0, 0}

不知道删除一个元素会变成0还是NULL?

谢谢!

【问题讨论】:

  • 你不能让int 成为一个“空”值,它必须是一个整数(在大多数平台上NULL 0
  • 好的,所以回答了 1 个问题,那么主要问题呢?
  • 主要问题的答案是:是的。你试过做什么?展示代码并解释你有什么问题
  • 真正发生的是,您必须向下移动所有较高的元素以覆盖要删除的值并将适当的较高元素设置为零。

标签: c arrays


【解决方案1】:

您可以对数组进行两次迭代,第一次迭代两次以翻转要删除的元素,第二次迭代将零与非零分开。

    int a[] = {5, 8, 5, 6, 9, 5};
    int n = 6;
    for(int i = 0 ; i < n ; i++ ) {
        if(a[i] == 5 ) {
            a[i] = 0;
        }
    }
    int* zero = a;

    int* nonZero = a;
    int j = 0;

    while(j < n) {

        while(*zero != 0) {
            zero++;
        }       

        while(*nonZero == 0) {
            nonZero++;
            j++;
        }
        if(zero < nonZero) {
            *zero = *nonZero;
            *nonZero = 0;
        }
        j++;
    }

【讨论】:

    【解决方案2】:

    您的数组是静态分配的,因此始终具有相同的大小,并且删除的元素具有 0 值(根据您定义删除值的方式)。

    This link 可以帮助您并解释如何从数组中删除元素。

    【讨论】:

      【解决方案3】:

      我用 C 编程已经有一段时间了,但它是可行的。

      这只是一个伪代码,你只需要把它改成C编程的方式。

      int a[] = {5, 8, 5, 6, 9, 5};
      int b[] = {5, 8, 5, 6, 9, 5}; // copy of array a to hold temp
      for(int i = 0; i < Size of array; i++ ){
        for(int j = i; j < Size of array; j++ ){
          if(b[j] != 5){
             a[i] = b[j];
             a[j] = b[i];
             break;
          }
        }
      }
      

      它会像(▼:要交换的目标,F:已完成,X:不是要交换的目标,N:未处理):

      ▼、▼、N、N、N、N

      5、8、5、6、9、5

      F、▼、X、▼、N、N

      8、5、5、6、9、5

      F、F、▼、X、▼、N

      8、6、5、5、9、5

      结果: 8、6、9、5、5、5

      而删除 5s,这完全不同,取决于您的意思。如果你不改变数组的大小,那么它们可以是 0 或 undefined(null)。所以我认为它的不同在于你如何编写返回数组的函数。

      【讨论】:

      • 这在空间和时间使用上都非常低效。另外,如何更改静态大小的数组的大小?这在标准 C 中是不可能的
      • 据我记忆,他并没有要求表演。好吧,如果您有那么丰富的经验,那么您如何为每个人编辑/编写答案呢! :) 确实,不可能更改静态大小的数组,但是如果您创建具有不同大小但只有数字而没有 5s 的新数组,那么可以。所以在我看来,这就是你如何编程的问题。再次强调,我们在这里并不专注于高性能优化。
      【解决方案4】:

      您的数组不是动态的,因此您无法在分配后减小其大小。将值设置为零可能会解决您的问题。

      【讨论】:

      • 这不是 OP 所要求的 - 他们的问题中没有任何地方询问有关减小数组大小的问题
      猜你喜欢
      • 2012-08-26
      • 2015-03-23
      • 1970-01-01
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-03
      相关资源
      最近更新 更多