2022-5-3-重新排列日志文件

937. 重新排列日志文件

来源:力扣(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;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jiawen9

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值