1 条题解
-
0
解题思路:
对输入的包含数值和字符串的混合序列进行处理,分别将数值按大小排序,字符串按字典序(不区分大小写)排序,然后按照输入中数值和字符串的顺序依次输出排好序的结果。算法思想是先对输入的混合序列进行解析,分离出数值和字符串,再分别对这两类数据应用相应的排序规则,最后按原顺序输出。
分析:
数据解析:通过遍历输入字符串,根据字符类型(数字、正负号、字母等)将输入字符串分割成数值和字符串,分别存储在不同的容器中。例如,遇到数字或正负号时,将其组成数值;遇到字母时,将其组成字符串。
排序规则:
1.对于字符串,使用 fun1 函数将所有字符转换为小写,然后使用 cmp1 函数进行字典序比较,实现不区分大小写的字典序排序。
2.对于数值,使用 fun2 函数将字符串形式的数值转换为整数,然后使用 cmp2 函数进行数值大小比较,实现按数值大小排序。
输出策略:根据输入时记录的每个元素是数值还是字符串的标记(bz 数组),依次从排好序的数值数组和字符串数组中取出对应元素输出,保持原有的数值和字符串的顺序关系。
实现步骤:
输入处理:不断读取输入字符串,直到输入为 "." 时结束程序。
数据解析与存储:
1.遍历输入字符串,将数值部分(包含正负号)提取并转换为字符串形式存储在 ve2 中,并标记为数值(bz 数组对应位置为 0)。
2.将字符串部分提取并存储在 ve1 中,并标记为字符串(bz 数组对应位置为 1)。
排序操作
1.对存储字符串的 ve1 容器使用 sort 函数和 cmp1 比较规则进行排序。
2.对存储数值的 ve2 容器使用 sort 函数和 cmp2 比较规则进行排序。
3.输出结果:根据 bz 数组的标记,依次从 ve1 和 ve2 中取出元素输出,元素之间用 "," 分隔,最后一个元素后输出 "."。
c++实现:
#include <iostream> #include <vector> #include <algorithm> #include <cctype> #include <sstream> #include <string> #include <cstdlib> using namespace std; bool isNumber(const string &s) { if (s.empty()) return false; size_t i = 0; if (s[0] == '-' || s[0] == '+') i++; for (; i < s.size(); ++i) { if (!isdigit(s[i])) return false; } return true; } string toLower(const string &s) { string lower; for (size_t i = 0; i < s.size(); ++i) { lower += tolower(s[i]); } return lower; } bool compareWords(const string &a, const string &b) { string lowerA = toLower(a); string lowerB = toLower(b); return lowerA < lowerB; } bool compareNumbers(const string &a, const string &b) { int numA = atoi(a.c_str()); int numB = atoi(b.c_str()); return numA < numB; } void processList(const string &line) { vector<string> elements; vector<bool> isNum; string current; for (size_t i = 0; i < line.size(); ++i) { char c = line[i]; if (c == ',' || c == '.' || c == ' ') { if (!current.empty()) { elements.push_back(current); isNum.push_back(isNumber(current)); current.clear(); } } else { current += c; } } if (!current.empty()) { elements.push_back(current); isNum.push_back(isNumber(current)); } vector<string> words; vector<string> numbers; for (size_t i = 0; i < elements.size(); ++i) { if (isNum[i]) { numbers.push_back(elements[i]); } else { words.push_back(elements[i]); } } sort(words.begin(), words.end(), compareWords); sort(numbers.begin(), numbers.end(), compareNumbers); size_t wordIndex = 0, numIndex = 0; for (size_t i = 0; i < elements.size(); ++i) { if (i != 0) { cout << ", "; } if (isNum[i]) { cout << numbers[numIndex++]; } else { cout << words[wordIndex++]; } } cout << "." << endl; } int main() { string line; while (getline(cin, line)) { if (line == ".") break; processList(line); } return 0; }
- 1
信息
- ID
- 521
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 14
- 已通过
- 1
- 上传者