字符串字符类型排序问题|豆包MarsCode AI刷题

128 阅读2分钟

问题描述

小C 需要对一个字符串进行特殊排序,这个字符串只包含三种字符类型:字母(大小写)、数字和问号。要求你按照以下规则进行排序:

  1. 问号的原始位置必须保持不变。
  2. 数字的原始位置必须保持不变,但数字要按照从大到小排序。
  3. 字母的原始位置必须保持不变,但字母要按照字典序从小到大排序。

你需要编写一个程序,帮助小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;
}

- [ 代码分析]

  1. 头文件和命名空间

    • 包含了必要的头文件:<algorithm><iostream><string><vector>
    • 使用了 using namespace std; 来简化标准库的使用。
  2. 函数 solution

    • 接受一个字符串 inp 作为输入。
    • 使用两个 vector<char> 分别存储字母和数字。
    • 遍历输入字符串,将字母和数字分别存入对应的 vector 中。
    • 对字母 vector 进行字典序升序排序,对数字 vector 进行从大到小排序。
    • 创建一个与输入字符串相同长度的结果字符串 result
    • 再次遍历输入字符串,根据字符类型(字母或数字)从对应的 vector 中取出排序后的字符,替换到结果字符串的相应位置。
    • 返回结果字符串。
  3. 主函数 main

    • 包含三个测试用例,分别调用 solution 函数并输出结果。

代码逻辑

  • 收集字符:通过遍历输入字符串,将字母和数字分别收集到两个 vector 中。
  • 排序:对字母 vector 进行字典序升序排序,对数字 vector 进行从大到小排序。
  • 替换字符:再次遍历输入字符串,根据字符类型从排序后的 vector 中取出字符,替换到结果字符串的相应位置。