【LeetCode刷题】937. 重新排列日志文件——sort()的返回问题

题目

LeetCode原题如下所示:
在这里插入图片描述

问题

刷这道题的时候有很大疑惑,不知道truefalse到底是咋么回事。参考了一篇觉得还不错的博文:https://blog.csdn.net/weixin_45695709/article/details/124563140
这里想做点补充,以防我这🐟的记忆。

cmp应该很多童鞋已经晓得了,针对这道题也许你有以下一连串的困惑:
1.到底true是交换还是不交换?
2.为啥前面关于严格大小的判断通过了,同样的逻辑后面就不行了?
3.当两者相同时,如何返回是否交换的指令?

逻辑理解与代码展示

这里做的补充如下:
1、sort()函数本质类似快排算法(一般取第一个值为基准值),即用待比较值基准值进行比较,如果”小于“基准值,则待比较值与基准值进行交换,也就是排到基准值前面,我们这里返回true,即true就进行交换操作
2、sort()(stable_sort())传入的参数中第一个参数是待比较值,第二个参数是基准值。

我们以该题为例(对应if语句部分):
当第一个字符串a正文是字母,第二个字符串b正文是数字的时候,那么基准值b逻辑上应该是”大于“待比较值a(a排b前面),那么就需要进行位置交换,把a换到前面去,因此我们返回true;同理当第一个字符串a正文是数字,第二个字符串b正文是字母的时候,那么基准值b逻辑上确实是”小于“待比较值a(b排a前面),那么就不用进行操作了,我们返回false。第三个if语句应该好理解,此处省略;最后一个逻辑点就是剩下当两个字符串正文都是数字的情况,这时候,按照题意我们是不希望交换顺序的,那么我们就顺理成章地返回false了。

代码如下:

bool cmp( string a, string b ){
    int index1 = a.find_first_of(' ');
    int index2 = b.find_first_of(' ');
    string s1,s2;
    s1 = a.substr( index1 + 1 );
    s2 = b.substr( index2 + 1 );
    if ( isalpha(s1[0]) && isdigit(s2[0]) ){
        return true;
    }
    else if( isdigit(s1[0]) && isalpha(s2[0]) ){
        return false;
    }
    else if( isalpha(s1[0]) && isalpha(s2[0]) ){
        if ( s1 == s2 ){
            return a < b;
        }
        else{ return s1 < s2; }
    }
    else {
        return false;
    }
}
class Solution {
public:
    vector<string> reorderLogFiles(vector<string>& logs) {
        if( logs.size()<2 ) return logs;
        stable_sort(logs.begin(),logs.end(),cmp);
        return logs;
    }
};

刚才推荐的博文也是讨论了部分这个问题,讲得很有条理,重点突击,不过传参顺序部分有一点绕,我觉得也许可以从不同角度记忆一下,仅供参考。

总结:

1、true就代表进行交换操作,即将待比较值换到基准值前面去。
2、面对严格大小比较用sort()就够了,涉及到相同值的情况,则用stable_sort()函数,牺牲掉一部分性能来使得”无大小关系“的元素相对初始位置不发生变化,更加稳定。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值