题解
数字之和
1 条题解
-
0
解题思路
题目要我们做两件事:
第一件事:求每个字符串的数字之和。 字符串里每一位都是数字字符,把它们都转成数字加起来就行。字符转数字有个小技巧:
s[j] - '0'。 因为字符'0'的 ASCII 码是 48,字符'5'的 ASCII 码是 53,53-48=5,所以减去'0'就把数字字符变成了数字本身。第二件事:把字符串按"由大到小"排序。 这里的"由大到小"指的是字典序(字母表顺序):从第一个字符开始比,谁的字符大谁就排在前面。 用样例验证:
7289624316524012048,第一位分别是 7、6、5、0,所以排成7289624316524012048。 (注意:是按字符串本身比,不是按数字之和比!524 的和只有 11,但它排在了和为 15 的 012048 前面。)排序我们用选择排序:让第 i 位轮流和后面所有的比,如果后面有更大的,就交换到前面来,最后从大到小排好。
输出格式:
- 第一行按输入顺序输出每个字符串的数字之和(注意这里不能排序,要按原来的顺序!)。
- 第二行输出排序后的字符串。
参考代码
#include <iostream> using namespace std; // 用途:求每个字符串的数字之和,并把字符串按照从大到小(字典序降序)输出 int main() { int n; cin >> n; string a[105]; // 保存输入的字符串(保持输入顺序) string b[105]; // 保存排序后的字符串 int sum[105]; // 每个字符串的数字之和 for (int i = 0; i < n; i++) { cin >> a[i]; b[i] = a[i]; // 复制一份用于排序 sum[i] = 0; for (int j = 0; j < a[i].size(); j++) sum[i] += a[i][j] - '0'; // 把每一位数字字符累加起来 } // 第一行:按输入顺序输出每个字符串的数字之和 for (int i = 0; i < n; i++) { if (i > 0) cout << ' '; cout << sum[i]; } cout << endl; // 选择排序:让字符串从大到小排列(字典序降序) for (int i = 0; i < n - 1; i++) for (int j = i + 1; j < n; j++) if (b[j] > b[i]) swap(b[i], b[j]); // 大的换到前面 // 第二行:输出排序后的字符串 for (int i = 0; i < n; i++) { if (i > 0) cout << ' '; cout << b[i]; } cout << endl; return 0; }复杂度分析
- 时间复杂度:求数字之和时,每个字符串长度最多 200、最多 100 个字符串,总字符数约 20000,这部分是 O(总字符数)。选择排序有两层循环,最多
100×100=10000次比较,是 O(n²)。两者加在一起也能瞬间算完。 - 空间复杂度:存了数组 a 和 b,各最多 100 个字符串,是 O(n)。
- 1