首页 > 解决方案 > 将所有非空元素向左移动

问题描述

如果元素为 0,则元素必须向左移动。我尝试了一个从 2D 矩阵数组末尾开始的循环,但我似乎无法理解为什么它不起作用。

输入必须在 -999 到 999 的范围内。

我将 != 0 的元素分配给第一个索引,然后如果必须将该临时整数向前移动一步。这是我的主要问题,因为我无法理解它。也许需要一种不同的方法?

(我试图在没有指针的情况下解决它)

int main()
{
    int M[3][3];
    int j = 0;
    int i = 0;

    for(i = 0; i < 3; ++i){
        for(j = 0; j < 3; ++j){
            printf("Give me the number for [%d][%d]: ", i, j);
            scanf("%d", &M[i][j]);

            if(-999 > M[i][j] || M[i][j] > 999) j--;
            // a)
            if((i + j) % 2 == 0) {
                M[i][j] = 0;
            }

        }
    }
    // Print the result of a) 
    for(i = 0; i < 3; ++i){
        for(j = 0; j < 3; ++j){
            printf("%d ", M[i][j]);
        }
        printf("\n");
    }

    // Shifting the elements to the left  b)
    int temp = M[0][0];
    for(i = 2; i >= 0; i--)
    {
        for(j = 2; j >= 0; j--){
            if(M[i][j] != 0)
            {
                M[i][j] = temp;
            }
            // change the value of temp
        }
    }
    // Print the array after a) and b)
    for(i = 0; i < 3; ++i){
        for(j = 0; j < 3; ++j){
            printf("%d ", M[i][j]);
        }
    }
}

a) 的结果只是第一步之后的矩阵,其中 if (i=j) 将该位置的值转换为 0。

例如,如果您输入: 1 2 3 4 5 6 7 8 9
结果将是: 0 2 0 4 0 6 0 8 0
b) 的最终结果尚未完成,但应如下所示: 2 4 6 8 0 0 0 0 0。

标签: csortingmatrix

解决方案


也许需要一种不同的方法?

由于 [3][3] 数组像 [1][3*3] 一样在内存中,因此简单的移位M[0]就好像它有 9 个元素一样。

unsigned nonzero_index = 0;
for(i = 0; i < 3*3; ++i){
  if (M[0][i]) {
    M[0][nonzero_index++] = M[0][i];
  }
}
while (nonzero_index < 3*3) { //  zero fill the rest
  M[0][nonzero_index++] = 0;
}

推荐阅读