c - 将所有非空元素向左移动
问题描述
如果元素为 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。
解决方案
也许需要一种不同的方法?
由于 [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;
}
推荐阅读
- python - PySpark DataFrame 中作为新列的行模式
- flutter - 使用不包含 MediaQuery 的上下文调用 MediaQuery.of()
- r - 根据 R 中的日期将行拆分为两个并添加新列
- java - 在二维数组中找到最长的路径(如多米诺骨牌)
- django - Django 不在 Debug True 中提供静态文件
- jupyter-notebook - 为什么这件作品在 jupyter-notebook 中是错误的,而在终端中是正确的?
- c# - 如何从 Windows 10 机器上收到的消息中删除象形文字?
- java - Spring JPA - findAll() 与示例/探针包括相关/加入实体
- bash - 这个 '${image##*/}' 大括号扩展有什么作用?
- python - Pycharm 与 cmd 终端有不同的输出