【华为OD机试真题 C++】 字符串排序【2022 Q4 | 100分】

前言

《华为OD机试真题 C++》 本专栏包含华为OD机试真题C++解答,会实时更新收纳网友反馈,为大家更新最新的华为德科OD机试试题,为大家提供学习和练手的题库,订阅本专栏后可私信进交流群哦

题目描述

 【字符串排序】 

排序规则:

1. 单词中字母比较不区分大小写,两个单词先以第一个字母作为排序的基准,

如果第一个字母相同,就用第二个字母为基准,如果第二个字母相同就以第三个字母为基准。

依此类推,如果到某个字母不相同,字母顺序在前的那个单词顺序在前。

2. 当一个短单词和一个长单词的开头部分都相同(即短单词是长单词从首字母开始的一部分),短单词顺序在前。

3. 字母大小写不同的相同单词,只输出一次。

示例 1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

Hello hello world

输出

Hello world

示例 2 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

i LOVE Cc I love CC Hello Hel Hellow

输出

Cc Hel Hello Hellow i LOVE

C++代码实现:

#include 

#include 

using namespace std;

#define IOS cin.sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define SZ(x) ((int)(x).size())

class Solution {
public:
    // 待实现函数,在此函数中填入答题代码
    string SortString(const string &str)
    {
        string s(str);
        vector out;
        SplitString(s, out, " ");
        for (auto &i: out) {
            if (CheckString(i, SZ(stringArray))) {
                continue;
            } else {
                stringArray.pb(i);
            }
        }

        sort(all(stringArray), comp);

        string stringBuilder;

        for (const string &stringarray: stringArray)
            stringBuilder.append(stringarray).append(" ");

        return stringBuilder.erase(SZ(stringBuilder) - 1);
    }

    static int comp(string &lhs, string &rhs)
    {
        string dstData, dstTemp;
        transform(all(lhs), back_inserter(dstData), ::toupper);
        transform(all(rhs), back_inserter(dstTemp), ::toupper);
        return dstData.compare(dstTemp) < 0;
    }

private:
    vector stringArray;

    static void SplitString(string input, vector &output, const string &pattern)
    {
        string::size_type pos;
        input += pattern;
        for (int i = 0; i < input.size(); i++) {
            pos = input.find(pattern, i);
            if (pos < input.size()) {
                string temp = input.substr(i, pos - i);
                if ((temp != pattern) && (!temp.empty())) {
                    output.push_back(temp);
                }
                i = pos + pattern.size() - 1;
            }
        }
    }

    bool CheckString(string data, int num)
    {
        // 解决重复,大小写问题
        string dstData, dstTemp;
        string temp = std::move(data);
        transform(all(temp), back_inserter(dstData), ::toupper);
        for (int i = 0; i < num; i++) {
            dstTemp.clear();
            string eachStr = stringArray[i];
            transform(all(eachStr), back_inserter(dstTemp), ::toupper);
            if (dstData == dstTemp) {
                return true;
            }
        }
        return false;
    }
};

int main(int argc, const char *argv[])
{
    IOS
    string line;
    line.clear();

    getline(cin, line);

    Solution solo;
    cout << solo.SortString(line) << endl;

    return 0;
}

你可能感兴趣的:(华为OD机试真题,C++,c++,华为)