关于力扣的937题:
题目描述:你有一个日志数组 logs。每条日志都是以空格分隔的字串。
对于每条日志,其第一个字为字母数字或标识符。然后,要么:
1.标识符后面的每个字将仅由小写字母组成,或;
2.标识符后面的每个字将仅由数字组成。
我们将这两种日志分别称为字母日志和数字日志。保证每个日志在其标识符后面至少有一个字。
将日志重新排序,使得所有字母日志都排在数字日志之前。字母日志按内容字母顺序排序,忽略标识符;在内容相同时,按标识符排序。数字日志应该按原来的顺序排列。
返回日志的最终顺序。
示例 :
输入:[“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”]
题目链接:https://leetcode-cn.com/problems/reorder-data-in-log-files
看到题目的第一想法就是如何将日志分类,先分类,分类后可以通过某种方式,使得日志数组有序。很容易想到可以对其进行自定义的排序。
class Solution {
public:
vector<string> reorderLogFiles(vector<string>& logs) {
stable_sort(logs.begin(), logs.end(), _cmp);
return logs;
}
static bool _cmp(const string& str1, const string& str2){
int pa = 0;
int pb = 0;
while(str1[pa++] != ' ');
while(str2[pb++] != ' ');
bool aisNum = str1[pa] >= '0' && str1[pa] <= '9';
bool bisNum = str2[pb] >= '0' && str2[pb] <= '9';
if(!aisNum&& bisNum) return true;
if(aisNum&& !bisNum) return false;
if(aisNum&& bisNum) return false; // return false 的话,若a和b都是数字日志且相等,那么它们将会保持原来的顺序。
int cmp = a.compare(pa, -1, b, pb, -1);
if(cmp == 0) return a.compare(0, pa, b, 0, pb) <= 0;
else if(cmp < 0) return true; // a is lower
else return false;
}
};