【近日力扣】二进制中1的个数+扑克牌中的顺子+IP 地址无效化+把字符串转换成整数+跳水板

二进制中1的个数(简单)

位运算需要熟练

  • 思路1:用 n 和 1做位运算与然后左移去除 n 的末位,结果为真则计数器加一
  • 思路2:借助 n & n-1 去掉最低位 1 的特性,去掉一次就计数器加一,直到 n 为零
var hammingWeight = function(n) {
    let sum = 0
    // for (let i = 0; i < 32; i++) {
    //     if (n & (1 << i)) sum++
    // }
    while (n) {
        n &= n - 1
        sum++
    }
    return sum
};

扑克牌中的顺子(简单)

  • 思路:找规律,根据以下三种情况
// 注意!!! 0 代表任何数,所以 0 0 1 2 5 是顺子,可化为 1 2 3 4 5
没有零:[a, b, c, d, e]
一个零:[0, a, b, c, d]
两个零:[0, 0, a, b, c]
// 有零则排除零,只要最大值减去最小值小于5,则意味着另外三个数怎么都可以填充在两数其间
var isStraight = function(nums) {
    let n = []
    // 初始化,最大值赋最小,最小值赋最大
    let max = 0, min = 13
    for (let i = 0; i < 5; i++) {
        if (nums[i] === 0) continue
        max = Math.max(nums[i], max)
        min = Math.min(nums[i], min)
        if (n.includes(nums[i])) return false
        n.push(nums[i])
    }
    return max - min < 5
};

IP 地址无效化(简单)

replace 函数当然很容易想到,但极少面试官是想考 API 的调用。

  • 思路:遍历 IP 地址,当遇到 “.” 就替换为 “[.]”,JS 好操作的地方在于可以直接用加法拼接字符串
var defangIPaddr = function(address) {
    let a = ""
    for (let i = 0; i < address.length; i++) {
        address[i] === "." ? a += "[.]" : a += address[i]
    }
    return a
};

把字符串转换成整数(中等)

  • 思路:正则去除首部空格后,如果第一位是“+” “-” “0~9”,则遍历字符串将合法数字假如一个新的字符串,最后返回新字符串带表的数值。注意:返回的数值得介于 [-2^31, 2^31] 之间
var strToInt = function(str) {
    let s = str.replace(/^\s+/, "")
    if (isNaN(parseInt(s))) return 0
    if (s[0] === "+" || s[0] === "-" || /[0-9]/.test(s[0])) {
        let numStr = s[0]
        for (let i = 1; /[0-9]/.test(s[i]); i++) {
            numStr += s[i]
        }
        if (numStr < Math.pow(-2, 31)) return Math.pow(-2, 31)
        if (numStr > Math.pow(2, 31) - 1) return Math.pow(2, 31) - 1
        return numStr
    }
    ret

跳水板(简单)

  • 思路:找规律,先计算出 k 块短板能拼出的长度(即为最短长度),然后用长板一块一块的替换掉短板即可,有两个坑要注意,如下文
var divingBoard = function(shorter, longer, k) {
    let len = []
    // 长短板相等时,会出现重复长度记录在数组里
    if (shorter === longer) return k ? [shorter * k] : []
    for (let i = 0; i <= k; i++) {
        len.push(shorter * (k - i) + longer * i)
    }
    // 如果 k 为 0,返回空数组
    return k ? len : []
};

如果觉得对你有帮助的话,点个赞呗~

反正发文又不赚钱,交个朋友呗~

如需转载,请注明出处foolBirdd

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值