- 日志排序
中文English
给定一个字符串列表 logs, 其中每个元素代表一行日志. 每行日志信息由第一个空格分隔成两部分, 前面是这一行日志的 ID, 后面是日志的内容(日志的内容中可能包含空格). 一条日志的内容要么全部由字母和空格组成, 要么全部由数字和空格组成.
现在你需要按照如下规则对列表中的所有日志进行排序:
内容为字母的日志应该排在内容为数字的日志之前
内容为字母的日志, 按照内容的字典序排序, 当内容相同时则按照 ID 的字典序
内容为数字的日志, 按照输入的顺序排序
Example
样例 1:
输入:
logs = [
“zo4 4 7”,
“a100 Act zoo”,
“a1 9 2 3 1”,
“g9 act car”
]
输出:
[
“a100 Act zoo”,
“g9 act car”,
“zo4 4 7”,
“a1 9 2 3 1”
]
解释: “Act zoo” < “act car”,所以输出如上。
样例 2:
输入:
logs = [
“zo4 4 7”,
“a100 Actzoo”,
“a100 Act zoo”,
“Tac Bctzoo”,
“Tab Bctzoo”,
“g9 act car”
]
输出:
[
“a100 Act zoo”,
“a100 Actzoo”,
“Tab Bctzoo”,
“Tac Bctzoo”,
“g9 act car”,
“zo4 4 7”
]
解释:
由于 “Bctzoo” == “Bctzoo”, 所以比较”Tab”与”Tac”,有 “Tab” < “Tac”,故 “Tab Bctzoo” < “Tac Bctzoo”。
由于’ ‘ < ‘z’ ,所以 “a100 Act zoo” < “a100 Actzoo”。
Notice
日志总数不超过 5000
每行日志长度不超过 100
保证所有日志的 ID 不重复
class Solution {
public:
/**
* @param logs: the logs
* @return: the log after sorting
*/
bool all_num(string& str){
//cout << str << endl;
for(auto chr : str){
if(chr<'0' || chr>'9') return false;
}
return true;
}
bool is_num_content(string& str) {
stringstream ss(str);
int cnt = 0;
string token;
while(getline(ss, token, ' ')){
if(cnt>0 && all_num(token)) return true;
else if(cnt>0) return false;
cnt++;
}
return false;
}
int get_pos(const string& str){
for(int i=0; i < str.size(); ++i){
if(str[i]==' ') return i+1;
}
return -1;
}
vector<string> logSort(vector<string> &logs) {
// Write your code here
vector<string> num_content;
vector<string> str_content;
for(auto& str : logs){
if(is_num_content(str)) {
num_content.emplace_back(str);
}else{
str_content.emplace_back(str);
}
}
//note lambda expression should capture this, when use public function inside the class.
sort(str_content.begin(), str_content.end(),[this](const string& str1, const string& str2){
int pos1=get_pos(str1), pos2 = get_pos(str2);
if(str1.substr(pos1) == str2.substr(pos2)) return str1 < str2;
return str1.substr(pos1) < str2.substr(pos2);
});
for(auto item : num_content){
str_content.emplace_back(item);
}
return str_content;
}
};