专栏首页Michael阿明学习之路LeetCode 937. 重新排列日志文件(自定义排序)

LeetCode 937. 重新排列日志文件(自定义排序)

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;
        else
            return 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;
            else
                return preA < preB;
        }
}
};

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LeetCode 131. 分割回文串(回溯)

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/palindrome-partitioning 著作...

    Michael阿明
  • LeetCode 436. 寻找右区间(二分查找)

    给定一组区间,对于每一个区间 i,检查是否存在一个区间 j,它的起始点大于或等于区间 i 的终点,这可以称为 j 在 i 的“右侧”。

    Michael阿明
  • LeetCode 537. 复数乘法

    来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/complex-number-multiplicati...

    Michael阿明
  • C# 实现的Javascript加密算法

    不打算公开的,不过转念一想,反正又没人看,就发出来吧。 这是使用C#来实现的JS加密的,被加密的JS文件,代码需要写的规范,不能少了分号(;)等js中可能会被忽...

    徐大嘴
  • Leetcode: Compare Version Numbers

    题目: Compare two version numbers version1 and version2. If version1 > version...

    卡尔曼和玻尔兹曼谁曼
  • laravel批量生成假数据的方法

    以上这篇laravel批量生成假数据的方法就是小编分享给大家的全部内容了,希望能给大家一个参考。

    砸漏
  • 水果(STL+排序)- HDU 1263

    夏天来了~~好开心啊,呵呵,好多好多水果~~ Joe经营着一个不大的水果店.他认为生存之道就是经营最受顾客欢迎的水果.现在他想要一份水果销售情况的明细表,这样J...

    ACM算法日常
  • 用一个测试类简化排序算法时间复杂度的研究

    在学习算法的过程中,除了熟练掌握各种算法的程序逻辑外,还经常需要用到一些测试案例对算法的时间复杂度做具体的测试。本文将通过打造一个测试类工具包,让我们可以更简便...

    智慧zhuhuix
  • Java 并发集合的实现原理

    可以用原子方式更新int值。类 AtomicBoolean、AtomicInteger、AtomicLong 和 AtomicReference 的实例各自提供...

    用户1257393
  • 聊聊DubboOpenFeignAutoConfiguration

    spring-cloud-alibaba-0.9.0.RELEASE/spring-cloud-alibaba-dubbo/src/main/java/org/...

    codecraft

扫码关注云+社区

领取腾讯云代金券