1. 题目
你有一个日志数组 logs。每条日志都是以空格分隔的字串。
对于每条日志,其第一个字为字母数字标识符。然后,要么:
- 标识符后面的每个字将仅由小写字母组成,或;
- 标识符后面的每个字将仅由数字组成。
我们将这两种日志分别称为字母日志和数字日志。保证每个日志在其标识符后面至少有一个字。
将日志重新排序,使得所有字母日志都排在数字日志之前。字母日志按内容字母顺序排序,忽略标识符;在内容相同时,按标识符排序。数字日志应该按原来的顺序排列。
返回日志的最终顺序。
示例 :
输入:["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo"]
输出:["g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]提示:
0 <= logs.length <= 100
3 <= logs[i].length <= 100
logs[i] 保证有一个标识符,并且标识符后面有一个字。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reorder-data-in-log-files
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 自定义排序
- 注意用稳定排序
- 自定义函数写法
string getStr(const string &s, string &pre)
{int i = 0;while(s[i] != ' '){pre += s[i];i++;}return s.substr(i+1);
}bool cmp(string a, string b)
{string preA, preB;string sa = getStr(a,preA), sb = getStr(b,preB);if((isdigit(sa[0]) && isdigit(sb[0])))return false;else if((isdigit(sa[0]) && !isdigit(sb[0])))return false;else if((!isdigit(sa[0]) && isdigit(sb[0])))return true;else{if(sa != sb)return sa < sb;elsereturn preA < preB;}
}class Solution {
public:vector<string> reorderLogFiles(vector<string>& logs) {stable_sort(logs.begin(), logs.end(), cmp);return logs;}
};
比较函数写在类内,需要加上static
class Solution {
public:vector<string> reorderLogFiles(vector<string>& logs) {stable_sort(logs.begin(), logs.end(), cmp);return logs;}static string getStr(const string &s, string &pre){int i = 0;while(s[i] != ' '){pre += s[i];i++;}return s.substr(i+1);}static bool cmp(string a, string b){string preA, preB;string sa = getStr(a,preA), sb = getStr(b,preB);if((isdigit(sa[0]) && isdigit(sb[0])))return false;else if((isdigit(sa[0]) && !isdigit(sb[0])))return false;else if((!isdigit(sa[0]) && isdigit(sb[0])))return true;else{if(sa != sb)return sa < sb;elsereturn preA < preB;}
}
};
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!