leetcode 第937题 重新排列日志文件

关于力扣的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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值