代码之家  ›  专栏  ›  技术社区  ›  Facundo Schiavoni

将2d矩阵中的所有零移位

  •  4
  • Facundo Schiavoni  · 技术社区  · 7 年前

    我有一个这样的2d阵列:

    2 0 0 2 0 4
    2 0 0 2 0 4
    2 0 0 2 0 4
    

    我想把所有的零移到左边,所以我做了这个方法:

    public static void shiftLeft(int [][] array){
    
        for (int j = 0; j < array.length; j++) {
    
            for (int i = 0; i < array.length - 1; i++) {
    
                if ((array[j][i] != 0) && (array[j][i + 1] == 0)) {
                    array[j][i + 1] = array[j][i];
                    array[j][i] = 0;
                }
            }
        }
    }
    

    但我得到的结果是:

    0 0 2 0 2 4
    0 0 2 0 2 4
    0 0 2 0 2 4
    

    我怎样才能把所有的零都设置到左边?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Stram    7 年前

    在我看来,最简单的方法是使用3个嵌套循环。

    变量 一、 对行进行迭代。

    变量 j1 查找从每行左侧开始的第一个非零元素。

    变量 j2 查找后面的第一个零元素 j1 然后交换它们。 下面的代码假设二维矩阵A被声明为 A[N][M] ,其中N和M分别是行数和列数。

    for(int i =0;i<N;i++){
      for(int j1=0;j1<M;j1++){
        if (A[i][j1]==0)
          continue;
        for(int j2=j1;j2<M;j2++){
          if( A[i][j2]==0){
             //swap
             int tmp=A[i][j1];
             A[i][j1]=A[i][j2];
             A[i][j2]=tmp;
           }
         }
      }
    }
    
        2
  •  0
  •   Joachim Huet    7 年前

    事实上,特鲁吉斯的答案也是正确的,但它只会将零与第一个非零进行交换。所以数字的顺序会改变。

    这个答案不会改变数字的顺序:

        int[][] A = {   { 2, 3, 4, 2, 4, 4, 5, 0, 0, 0 },
                        { 0, 0, 0, 0, 0, 4, 3, 4, 5, 6 },
                        { 2, 0, 4, 2, 0, 4, 1, 2, 3, 4 }};
    
        int N = A.length;
        int M = A[0].length;
        int firstZeros = 0;
    
        for(int i = 0; i < N; i++) { // Loop over the rows 
            for(int j1 = 0; j1 < M; j1++) {
                // If there is a zero we pass by
                if (A[i][j1] == 0 && firstZeros == j1) {
                    firstZeros++;
                    continue;
                }
                // Otherwise, we have a value so we want to check if there is a zero afterwards
                for(int j2 = j1+1; j2 < M; j2++) {
                    // If we find a zero we move it to the left
                    if(A[i][j2] == 0) {
                        for (int j3 = j2; j3 > firstZeros; j3--) {
                            // Change zero with previous value
                            A[i][j3] = A[i][j3-1];
                            A[i][j3-1] = 0;
                        }
                        firstZeros++;
                    }
                }
            }
            firstZeros = 0;
        }