来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reorder-data-in-log-files
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路:
1.先将数字日志与字母日志分开来。
2.将字母日志按照标识符排序(解决相同内容不同标识符的排序问题),这一过程使用稳定排序和非稳定排序都可以,这里我选择简单选择排序。
3.将字母日志按照内容排序(解决不同内容的排序问题),这一过程要使用稳定排序,这里我用冒泡排序。
4.将数字日志放到字母日志后边。
代码如下:
class Solution {
public:
vector<string> reorderLogFiles(vector<string>& logs) {
vector<string> diglogs;
vector<string> strlogs;
vector<int> strtags; //字母日志中标识符的长度
//数字日志与字母日志分离
for(int i = 0; i < logs.size(); i ++){
for(int j = 0; j < logs[i].size(); j ++)
if(logs[i][j] == ' ' && logs[i][j + 1] < 'a'){
diglogs.push_back(logs[i]);
break;
}else if(logs[i][j] == ' ' && logs[i][j + 1] >= 'a'){
strlogs.push_back(logs[i]);
strtags.push_back(j); //记录字母日志中标识符的长度
break;
}else continue;
}
//简单选择排序按照标识符为字母日志排序
selectSort(strlogs, strtags);
//冒泡排序按照内容为字母日志排序
bubbleSort(strlogs, strtags);
//将数字日志放到字母日志后边
for(int i = 0; i < diglogs.size(); i ++)
strlogs.push_back(diglogs[i]);
//返回结果
return strlogs;
}
//交换函数
void exchange(vector<string>& strlogs, vector<int>& strtags, int left, int right){
string tmp1 = strlogs[left];
int tmp2 = strtags[left];
strlogs[left] = strlogs[right];
strtags[left] = strtags[right];
strlogs[right] = tmp1;
strtags[right] = tmp2;
}
//选择排序
void selectSort(vector<string>& strlogs, vector<int>& strtags){
for(int i = 0; i < strlogs.size() - 1; i ++){
int k = i;
for(int j = i + 1; j < strlogs.size(); j ++)
if(strlogs[j].substr(0, strtags[j]) < strlogs[k].substr(0, strtags[k])) k = j;
if(k != i) exchange(strlogs, strtags, i , k);
}
}
//冒泡排序
void bubbleSort(vector<string>& strlogs, vector<int>& strtags){
int i = 0;
int exchangetag = 1;
while(i < strlogs.size() - 1 && exchangetag){
exchangetag = 0;
for(int j = 0; j < strlogs.size() - 1 - i; j ++)
if(strlogs[j].substr(strtags[j], strlogs[j].size() - 1) > strlogs[j + 1].substr(strtags[j + 1], strlogs[j + 1].size() - 1)){
exchange(strlogs, strtags, j , j + 1);
exchangetag = 1;
}
i ++;
}
}
};
我的代码可能写的过于初级,以下是官方题解:
class Solution {
public:
vector<string> reorderLogFiles(vector<string>& logs) {
stable_sort(logs.begin(), logs.end(), [&](const string & log1, const string & log2) {
// 找到第一个空格
int pos1 = log1.find_first_of(" ");
int pos2 = log2.find_first_of(" ");
// 记录日志内容的第一个下标
bool isDigit1 = isdigit(log1[pos1 + 1]);
bool isDigit2 = isdigit(log2[pos2 + 1]);
// 都是数字日志不排序
if (isDigit1 && isDigit2) return false;
// 都是字母日志
if (!isDigit1 && !isDigit2) {
string s1 = log1.substr(pos1);
string s2 = log2.substr(pos2);
// 如果字母日志内容不相同,内容作比较
if (s1 != s2) return s1 < s2;
// 字母日志相同,整体作比较
return log1 < log2;
}
// 数字日志放到字母日志后边
return isDigit1 ? false : true;
});
return logs;
}
};