2021-04-22 | UNLOCK

虾皮一面相关面试题

实现 sum(1,2)(3).sumOf() === 6

都是泪呀,竟然没写出来,过后发现其实之前不难,以此谨记~

1
2
3
4
5
6
7
8
9
10
11
function sum() {
let args = [...arguments];
let add = function() {
args.push(...arguments);
return add;
}
add.sumOf = function() {
return args.reduce((acc, cur) => acc + cur);
}
return add;
}

算法题 从长度为 N 的 arr 数组中取 count 个数相加总和为 sum

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
* @param arr 目标数组
* @param count 要选取的元素数目
* @param sum 目标和
* @returns [] 计算结果的数组
*/
const search = (arr, count, sum) => {
// 利用二进制,选择元素的个数
const n = num => {
let count = 0;
while (num) {
num &= num - 1;
count++;
}
return count;
};

let len = arr.length;
let bit = 1 << len; // 换算成二进制,所有情况的总和
let res = [];

// 遍历所有的选择情况, 这里忽略了 0 的情况(n = 0)
for (let i = 1; i < bit; i++) {
// 满足选择的元素个数 === count
if (n(i) === count) {
let s = 0;
let temp = [];

// 每一种满足个数为 n 的选择情况下,继续判断是否满足 和为 m
for (let j = 0; j < len; j++) {
// 建立映射,找出选择位上的元素
if ((i & (1 << j)) !== 0) {
s += arr[j];
temp.push(arr[j]);
}
}

// 如果这种选择情况满足和为 M , 添加到结果数组中
if (s === sum) {
res.push(temp);
}
}
}

return res;
};

评论加载中