算法打卡第十六天

132 阅读1分钟
  1. 剑指 Offer 45. 把数组排成最小的数
  2. 剑指 Offer 61. 扑克牌中的顺子

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

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

题意理解: 根据数组中的数字进行打乱组合成一个最小的字符

  1. 使用数组内置排序,并自定义排序规则,n1n2-n2n1相比较进行互换
  2. 进行拆分

提示: 0 < nums.length <= 100

示例 1: 输入: [10, 2] 输出: "102"

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

var minNumber = function(nums) {
    const cUnms = nums.sort((a, b) => `${a}${b}` - `${b}${a}`).join('');
    return cUnms;
};

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

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

题意理解: 如果给出的五个数字可以连续,或替换大小王后可以连续,返回true; 否则为false

  1. 遍历数组,如果数组中存在两个相同的值,则返回false
  2. 申明两个变量,存储最大值和最小值,如果最大值建最小值+1<=5则返回true

限制: 数组长度为 5 数组的数取值为 [0, 13] .

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

示例 2: 输入: [0, 0, 1, 2, 5] 输出: True

var isStraight = function(nums) {
    let min = 0;
    let max = 0;
    for (let i = 0; i < nums.length; i++) {
        if (nums[i] !== 0 && nums.indexOf(nums[i]) !== nums.lastIndexOf(nums[i])) {
            return false;
        }
        if (min === 0 && max === 0 && nums[i] !== 0) {
            min = nums[i];
            min = nums[i];
        }
        if (nums[i] !== 0) {
            min = Math.min(min, nums[i])
            max = Math.max(max, nums[i])
        }
    }
    if (max - min + 1 <= 5) {
        return true
    }
    return false
}