首页 > 解决方案 > 在C中替换矩阵中的元素

问题描述

我需要检查矩阵主对角线上的元素是否是偶数并且是否可以整除为其索引之和。我记得一维数组中的这些元素:

for (i=0; i<n; ++i)
for (j=0; j<m; ++j)
    {
        if ((i == j) && ((arr[i][j] % 2) == 0))
            {
            arr2[count] = arr[i][j]; 
            ++count;
            break;
            }
    }

然后我将满足条件的元素替换为其索引之和,并为 [0][0] 放置一个特殊条件,因为除以 0:

    count = 0;
for (i=0; i<n; ++i)
for (j=0; j<m; ++j)
    {
        if ((i+j != 0) && (arr[i][j] == arr2[count]) && ((arr[i][j] % (i+j)) == 0))
            {
            arr[i][j] = i+j;
            ++count;
            }
        else if (((i+j) == 0) && (arr[i][j] == arr2[count])) arr[i][j] = 0;
    }

麻烦的是,当第一个元素是偶数时,它是唯一被替换的数字,并且该条件不适用于其他元素:

对不起这个颜色

标签: c

解决方案


问题:

arr2没有适当填写。一旦你将一个元素填入其中,你就会跳出那个循环。break注意在那个循环中的用法。此外,您没有更新countelse-if 条件中的值,这会导致您的循环徒劳地在整个搜索过程中运行arr2[0]

解决方案:

  1. 删除该break声明。

  2. 添加++count到那个 else-if 条件中。

奖金:

你写了丑陋的代码。您使用了一个额外的数组,这增加了代码的空间复杂度,并且您有太多的循环,这也增加了时间复杂度。随着您的进步,您稍后会理解这些事情,但现在,我会给您一个更好的解决方案:

// Deal with the (0, 0) case outside the loop
// And avoid an extra else-if inside the loop
if (arr[0][0] % 2 == 0)
    arr[0][0] = 0;

// There are n diagonal elements in a matrix of order n
// Row and column indexes of a diagonal element are equal
// So you can eliminate the use of j and just rely on i  
for (i = 1; i < n; ++i)
    // Check if the diagonal element is even and divisible by the sum of the indices
    if (arr[i][i] % 2 == 0 && arr[i][i] % (i + i) == 0)
        // Replace the element if the condition is satisfied
        arr[i][i] = i + i;

如您所见,这种方法不需要任何额外的空间,并且可以在非常好的线性时间内运行。您可以通过使用按位与检查一个数字是否不是奇数来进一步优化它,并使用按位左移运算符快速!(i & 1)更改i + i为奇数。2 * i(i << 1)

对了,你为什么要arr[0][0]换人?除以 0 是未定义的


推荐阅读