【华为OD机试真题 C++】 字符串排序【2022 Q4 | 100分】
前言
■ 题目描述
【字符串排序】
排序规则:
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 <bits/stdc++.h>
#include <utility>
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<string> 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<string> stringArray;
static void SplitString(string input, vector<string> &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;
}
