1 条题解

  • 0
    @ 2025-4-8 21:59:26

    解题思路:

    对输入的包含数值和字符串的混合序列进行处理,分别将数值按大小排序,字符串按字典序(不区分大小写)排序,然后按照输入中数值和字符串的顺序依次输出排好序的结果。算法思想是先对输入的混合序列进行解析,分离出数值和字符串,再分别对这两类数据应用相应的排序规则,最后按原顺序输出。

    分析:

    数据解析:通过遍历输入字符串,根据字符类型(数字、正负号、字母等)将输入字符串分割成数值和字符串,分别存储在不同的容器中。例如,遇到数字或正负号时,将其组成数值;遇到字母时,将其组成字符串。

    排序规则

    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
    上传者