【问题标题】:C# Trim spaces inside array (remove 0's)C#修剪数组内的空格(删除0)
【发布时间】:2012-02-07 15:19:54
【问题描述】:

如果我有下一个数组:

int[] arr = { 123, 243, 0, 0, 123, 0, 0, 0, 123 };

如何将所有不等于 0 的值尽可能向左移动,这样数组就可以这样构建:

int[] arr = { 123, 243, 123, 123, 0, 0, 0, 0, 0 };

谢谢!

【问题讨论】:

  • 这是作业吗?
  • 我会执行某种冒泡排序。如果这就是您的要求,则没有内置调用。

标签: c# arrays trim


【解决方案1】:

使用 LINQ 怎么样:

var result = arr.Where(x => x != 0).Concat(arr.Where(x => x == 0)).ToArray();

这非常易读并且具有线性时间复杂度。另一方面,它运行不正确,需要两次通过输入。

【讨论】:

    【解决方案2】:

    订购方式:

    int[] arr = { 123, 243, 0, 0, 123, 0, 0, 0, 123 }.OrderBy(x => x == 0).ToArray();
    

    【讨论】:

    • 又一个不错的!布尔值的顺序是假的,然后是真的,所以这确实有效! +1
    【解决方案3】:

    到目前为止,所有答案都创建了一个新数组。实际上,您可以在一个循环中向上移动项目,然后用 0 填充其余项目。

    public static void ShiftZerosRight(this int[] arr)
    {
        int j = 0;
        while (j < arr.Length && arr[j] != 0)
        {
            j++;
        }
        for (int i = j; i < arr.Length; i++)
        {
            if (arr[i] != 0)
            {
                arr[j++] = arr[i];
            }
        }
        while (j < arr.Length)
        {
            arr[j++] = 0;    
        }
    }
    

    不像单行 LINQ 表达式那样优雅,但更高效 - 这不会创建任何新对象(并且 LINQ 创建多个和最终的新数组)并且这是通过数组的单次传递。作为一种扩展方法,在主体中看不到复杂性,它可以用作:

    int arr[] = { ... };
    arr.ShiftZerosRight();
    

    【讨论】:

    • 此代码不起作用。如果数组有 0 开始 arr[j] != 0,这将在第一步失败
    【解决方案4】:

    也许将 Linq 用于:

            int[] arr = { 123, 243, 0, 0, 123, 0, 0, 0, 123 };
    
            arr = arr.OrderByDescending(a => a > 0).ToArray<int>();
    

    【讨论】:

      【解决方案5】:

      试试这个:

      arr.OrderBy(x=>x == 0).ToArray();
      

      【讨论】:

        【解决方案6】:

        创建一个新数组并将值传递给它。

        int[] newArr = new int[arr.Length];
        int i = 0;
        foreach ( var v in arr )
        {
            if (v != 0) 
            {
                newArr[i++] = v;
            }
        }
        arr = newArr;
        

        因为int 是一个值类型,所以数组初始化为全零。然后我们一次复制一个值,如果值不为 0,则只增加目标索引i。比所示的 Linq 示例更详细,而且明显不酷。但如果你是学生,可能会更容易理解。

        【讨论】:

          【解决方案7】:

          此代码 sn-p 不会创建另一个数组。这里 'x[]' 是您的数组。您取第一个 0 值并将其替换为非零数字。

          int i=0,j=0,index=0,temp=0;
          for(i=0;i<x.length;i++)
          {
              if(x[i]==0)
              {
                 index=i;
                 for(j=index;j<x.length;j++)
                 {
                    if(x[j]!=0)
                    {
                      temp=x[j];
                      x[j]=x[i];
                      x[i]=temp;
                      break;
                    }
                 }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-01
            • 2022-01-05
            • 2021-07-09
            • 2017-06-10
            相关资源
            最近更新 更多