力扣剑指Offer 第16天 排序(简单)剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子

博客介绍了力扣剑指Offer中关于排序和判断顺子的两个问题。对于剑指 Offer 45,通过自定义排序找到最小的数,使用比较器和lambda表达式实现。而在剑指 Offer 61 中,解决扑克牌是否为顺子的问题,首先对牌排序,然后检查是否存在足够的0牌(王牌)来形成顺子。
摘要由CSDN通过智能技术生成

力扣剑指Offer 第16天 排序(简单)剑指 Offer 45. 把数组排成最小的数 剑指 Offer 61. 扑克牌中的顺子

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

题目

输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。

示例 1:
输入: [10,2]
输出: "102"
示例 2:
输入: [3,30,34,5,9]
输出: "3033459"
提示:

0 < nums.length <= 100

说明:
  • 输出结果可能非常大,所以你需要返回一个字符串而不是整数
  • 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

题解

自动定义排序

自定义一个比较器,两者字符串拼接不同顺序的比较,取其小者;

(n1,n2)->(n1+n2).compareTo(n2+n1) lambda表达式

class Solution {
    public String minNumber(int[] nums) {
        //排序 拼接后最小 可以0开头 
    	List<String> list=new ArrayList<>(nums.length);
        for(int num:nums)list.add(String.valueOf(num));
        list.sort((n1,n2)->(n1+n2).compareTo(n2+n1));
        StringBuilder sb=new StringBuilder();
        for(String s:list)sb.append(s);
        return sb.toString();
    }
}

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

题目

若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。

示例 1:
输入: [1,2,3,4,5]
输出: True
示例 2:
输入: [0,0,1,2,5]
输出: True
限制:

数组长度为 5

数组的数取值为 [0, 13] .

题解

排序 替换
  1. 先进行排序
  2. 获取0牌(王牌)数量,如果王牌数量大于等于nums.length-1则直接返回true
  3. 从第一张非0牌开始(记录该非0牌start
  4. 后续必须保值等于srart+1
  5. 如果不等于start+1:
    1. 如果等于start,消耗一张王牌替换为start+1//超过限制可以自动替换到另一个临界值需要的值,这里用start+1统一替换,反正是等效的
    2. 如果不等于start,则下标i不变,继续判断该位置,使用王牌代替需要的start+1
    3. 如果王牌不够了则直接返回false
  6. 如果正常结束判断后则 返回 true
class Solution {
    public boolean isStraight(int[] nums) {
        Arrays.sort(nums);
        int zeros=0;
        while(nums[zeros]==0)zeros++;
        if(zeros>=nums.length-1)return true;
        int start=nums[zeros];
		for(int i=zeros+1;i<nums.length;i++){
			if(nums[i]!=++start)
            	if(zeros--==0)return false;
                else i--;
        }
        return true;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值