「剑指Offer」Day16:排序(简单)

剑指 Offer 45. 把数组排成最小的数

题目描述

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
输入: [3,30,34,5,9] 输出: "3033459"
说明:
  • 输出结果可能非常大,所以你需要返回一个字符串而不是整数
  • 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0
题目链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/

思路

该题本质上是一个排序问题,设数组 numsnumsnums 中任意两数字的字符串为 xxxyyy ,则规定排序判断规则如下:
  • 若拼接字符串x+y > y+x  ,则 x “大于” y ;
  • 反之,若 x+y < y+x ,则 x “小于” y;
根据上面的排序判断规则,应用快速排序进行实现
class Solution {
    public String minNumber(int[] nums) {
        int length = nums.length;
        String[] strs = new String[length];
        for(int i = 0; i < length; i++){ //将整数转换为字符串存入一个字符串数组
            strs[i] = String.valueOf(nums[i]);
        }
        quickSort(strs, 0, length - 1);
        StringBuilder sbr = new StringBuilder();
        for(String str : strs){ //遍历拼接
            sbr.append(str);
        }
        return sbr.toString();
    }
    public void quickSort(String[] strs, int start, int end){ //快速排序
        if(start >= end){
            return;
        }
        int left = start;
        int right = end;
        String pivot = strs[start]; //确定基准元素
        while(left != right){
            //拼接基准元素,比较并交换
            while(left < right && (strs[right] + pivot).compareTo(pivot + strs[right]) >= 0){
                right--;
            }
            while(left < right && (strs[left] + pivot).compareTo(pivot + strs[left]) <= 0){
                left++;
            }
            if(left < right){
                String temp = strs[left];
                strs[left] = strs[right];
                strs[right] = temp;
            }
        }
        strs[start] = strs[left];
        strs[left] = pivot;
        int pivotIndex = left;
        quickSort(strs, start, pivotIndex - 1); //对左边继续进行分治
        quickSort(strs, pivotIndex + 1, end); //对右边继续进行分治
    }
}

方法二:调用内置函数

调用内置函数,根据排序判断规则进行排序,
class Solution {
    public String minNumber(int[] nums) {
        int length = nums.length;
        String[] strs = new String[length];
        for(int i = 0; i < length; i++){ //将整数转换为字符串存入一个字符串数组
            strs[i] = String.valueOf(nums[i]);
        }
        //调用内置函数,根据排序判断规则进行排序
        Arrays.sort(strs, (x, y) -> (x + y).compareTo(y + x));
        StringBuilder sbr = new StringBuilder();
        for(String str : strs){ //遍历拼接
            sbr.append(str);
        }
        return sbr.toString();
    }
}

剑指 Offer 61. 扑克牌中的顺子

题目描述

从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
输入: [0,0,1,2,5] 输出: True
说明:大、小王为 0 ,可以看成任意数字,有两个0,2到5之间刚好缺少3,4,可使用0代替
链接:https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof

思路

根据题意为顺子的规则:
  1. 除大小王外,所有牌无重复 ;
  2. 设此 5 张牌中最大的牌为 max,最小的牌为 min (大小王除外),则需满足:max-min < 5
参考题解:https://leetcode-cn.com/problems/bu-ke-pai-zhong-de-shun-zi-lcof/solution/mian-shi-ti-61-bu-ke-pai-zhong-de-shun-zi-ji-he-se/

代码实现

class Solution {
    public boolean isStraight(int[] nums) {
        int joker = 0; //大小王的数量
        Arrays.sort(nums); //排序
        for(int i = 0; i < 4; i++){
            if(nums[i] == 0){ //为大小王就累加数量
                joker++;
                continue;
            }
            if(nums[i] == nums[i+1]){ //有重复直接返回false
                return false;
            }
        }
        //此时joker标识的是最小值,要求最大值-最小值小于5,才为顺子
        return nums[4] - nums[joker] < 5;
    }
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
2025-12-17 16:48
今天九点半到公司,我跟往常一样先扫了眼电脑,屁活儿没有。寻思着没事干,就去蹲了个厕所,回来摸出手机刷了会儿。结果老板刚好路过,拍了我一下说上班别玩手机,我吓得赶紧揣兜里。也就过了四十分钟吧,我的直属领导把我叫到小隔间,上来就给我一句:“你玩手机这事儿把老板惹毛了,说白了,你可以重新找工作了,等下&nbsp;HR&nbsp;会来跟你谈。”&nbsp;我当时脑子直接宕机,一句话都没憋出来。后面&nbsp;HR&nbsp;找我谈话,直属领导也在旁边。HR&nbsp;说我这毛病不是一次两次了,属于屡教不改,不光上班玩手机,还用公司电脑看论文、弄学校的事儿。我当时人都傻了,上班摸鱼是不对,可我都是闲得发慌的时候才摸啊!而且玩手机这事儿,从来没人跟我说过后果这么严重,更没人告诉我在公司学个习也算犯错!连一次口头提醒都没有,哪儿来的屡教不改啊?更让我膈应的是,昨天部门刚开了会,说四个实习生里留一个转正,让大家好好表现。结果今天我就因为玩手机被开了。但搞笑的是,开会前直属领导就把我叫去小会议室,明明白白告诉我:“转正这事儿你就别想了,你的学历达不到我们部门要求,当初招你进来也没打算给你这个机会。”合着我没入贵厂的眼是吧?可我都已经被排除在转正名单外了,摸个鱼至于直接把我开了吗?真的太离谱了!
rush$0522:转正名单没进,大概率本来就没打算留你
摸鱼被leader发现了...
点赞 评论 收藏
分享
2025-11-24 14:22
安徽师范大学 财务
勇敢求职牛牛:然后简历的话,我个人意见(双非本有零星的垃圾offer),学校经历太多了,写了也应该往财务方面靠,然后技能方面多写一点吧,比如ERP的水平,对某些行业的流程(制造业),对数据的逻辑和敏感之类的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务