二进制中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