我有一个像这样的二维数组:
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
如何让所有零都向左移动?
答案 0 :(得分:2)
在我看来,最简单的方法是使用3个嵌套循环。
变量 i 遍历行。
变量 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;
}
}
}
}
答案 1 :(得分:0)
事实上,Trugis的答案也是正确的,但它只会将零与第一个非零交换。所以数字的顺序会改变。
这个答案不会改变数字的顺序:
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;
}