问题描述
小C 需要对一个字符串进行特殊排序,这个字符串只包含三种字符类型:字母(大小写)、数字和问号。要求你按照以下规则进行排序:
- 问号的原始位置必须保持不变。
- 数字的原始位置必须保持不变,但数字要按照从大到小排序。
- 字母的原始位置必须保持不变,但字母要按照字典序从小到大排序。
你需要编写一个程序,帮助小C实现这个字符串的排序功能。
测试样例
样例1:
输入:
inp = "12A?zc"
输出:'21A?cz'
样例2:
输入:
inp = "1Ad?z?t24"
输出:'4Ad?t?z21'
样例3:
输入:
inp = "???123??zxy?"
输出:'???321??xyz?'
解答:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string solution(string inp) {
vector<char> letters;
vector<char> digits;
// 遍历字符串,分别收集字母和数字
for (char ch : inp) {
if (isalpha(ch)) {
letters.push_back(ch); // 收集字母
} else if (isdigit(ch)) {
digits.push_back(ch); // 收集数字
}
}
// 对字母按字典序升序排序
sort(letters.begin(), letters.end());
// 对数字按从大到小排序
sort(digits.begin(), digits.end(), greater<char>());
// 替换原字符串中的字母和数字
string result = inp;
int letter_idx = 0, digit_idx = 0;
for (int i = 0; i < inp.size(); i++) {
if (isalpha(inp[i])) {
result[i] = letters[letter_idx++];
} else if (isdigit(inp[i])) {
result[i] = digits[digit_idx++];
}
}
return result;
}
int main() {
// 测试用例
cout << (solution("12A?zc") == "21A?cz") << endl;
cout << (solution("1Ad?z?t24") == "4Ad?t?z21") << endl;
cout << (solution("???123??zxy?") == "???321??xyz?") << endl;
return 0;
}
- [ 代码分析]
-
头文件和命名空间:
- 包含了必要的头文件:
<algorithm>、<iostream>、<string>、<vector>。 - 使用了
using namespace std;来简化标准库的使用。
- 包含了必要的头文件:
-
函数
solution:- 接受一个字符串
inp作为输入。 - 使用两个
vector<char>分别存储字母和数字。 - 遍历输入字符串,将字母和数字分别存入对应的
vector中。 - 对字母
vector进行字典序升序排序,对数字vector进行从大到小排序。 - 创建一个与输入字符串相同长度的结果字符串
result。 - 再次遍历输入字符串,根据字符类型(字母或数字)从对应的
vector中取出排序后的字符,替换到结果字符串的相应位置。 - 返回结果字符串。
- 接受一个字符串
-
主函数
main:- 包含三个测试用例,分别调用
solution函数并输出结果。
- 包含三个测试用例,分别调用
代码逻辑
- 收集字符:通过遍历输入字符串,将字母和数字分别收集到两个
vector中。 - 排序:对字母
vector进行字典序升序排序,对数字vector进行从大到小排序。 - 替换字符:再次遍历输入字符串,根据字符类型从排序后的
vector中取出字符,替换到结果字符串的相应位置。