一、数字变换
给定一个整数,我们需要修改它的每一位:如果某一位是奇数,就变成 1;如果是偶数,就变成 0。最后输出处理后的结果。
思路解析
这道题的核心在于模拟过程。虽然可以直接对数字取模操作,但将其视为字符串处理会更直观。
遍历字符串中的每个字符,判断其奇偶性并替换即可。这里有个小技巧:字符 '0' 到 '9' 的 ASCII 码中,数字 0 到 9 的奇偶性与数值本身的奇偶性是一致的(例如 '0' 是 48 为偶数,'1' 是 49 为奇数),因此直接对字符进行 %2 判断即可,无需减去 '0'。
最后得到的字符串可能包含前导零,使用 stoi 函数可以方便地将其转换为整数并自动去除前导零。
代码实现
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
cin >> str;
for (int i = 0; i < str.size(); i++) {
if (str[i] % 2 == 0) {
str[i] = '0';
} else {
str[i] = '1';
}
}
cout << stoi(str) << endl;
return 0;
}
二、二维数组求和优化
输入一个 $n \times m$ 的二维数组,计算每个位置 $(i, j)$ 的得分。得分规则为该位置所在行的所有元素之和加上所在列的所有元素之和。
思路解析
最直接的暴力解法是对于每个点都重新遍历行和列求和,时间复杂度会达到 $O(n \cdot m \cdot (n + m))$,在数据量较大时容易超时。
观察发现,计算 $(i, j)$ 和 $(i, j+1)$ 时,第 $i$ 行的总和是不变的。我们可以预先计算出每一行和每一列的总和,存储起来。
这样,任意位置 $(i, j)$ 的得分就可以通过公式快速得出:row_sum[i] + col_sum[j] - arr[i][j]。注意这里减去了 arr[i][j],因为它在行和与列和中被重复计算了一次。
代码实现
#include <iostream>
using namespace std;
N = + ;
row[N];
col[N];
{
n, m;
(, &n, &m);
**arr = *[n];
( i=; i<n; ++i) arr[i] = [m];
( i = ; i < n; i++) {
( j = ; j < m; j++) {
(, &arr[i][j]);
row[i] += arr[i][j];
col[j] += arr[i][j];
}
}
( i = ; i < n; i++) {
( j = ; j < m; j++) {
(, row[i] + col[j] - arr[i][j]);
}
();
}
( i=; i<n; ++i) [] arr[i];
[] arr;
;
}


