这道题衍生于足球应用,离职前被安排面试(求推荐),期间碰到个有趣的答案,特此记录下。
原题如下: 有 A、B、C 三个字符,要求输入出 A、B、C、AB、BC、AC、BC、ABC,顺序没要求
我的答案
因为我写足球应用的时候,只关注比赛场次之间的组合,最后是根据倍率排序的,就不在乎顺序
const charList = ["A", "B", "C"],
resultList = [];
charList.forEach((char) => {
let list = [];
resultList.forEach((key) => list.push(key + char));
resultList.push(char, ...list);
});
console.log(resultList);
结果是 ['A', 'B', 'AB', 'C', 'AC', 'BC', 'ABC'],以 ABC 为例,它是包含 AB、C
- 当执行 A 到 resultList 没有,list 无新增,最后 resultList 有[ 'A' ]
- 当执行 B 到 resultList 有[ 'A' ],list 新增[ 'AB' ] ,最后 resultList 有 [ 'A', 'B', 'AB' ]
- 当执行 C 到 resultList 有[ 'A', 'B', 'AB' ],list 系新增[ 'AC', 'BC', 'ABC' ],最后 resultList 有['A', 'B', 'AB', 'C', 'AC', 'BC', 'ABC']
第二个答案
这个时候后面微信发给我的,执行发现不太对,输入越多,丢的值越多
var test = function(list='abcdfghijk') {
const len = list.length
const res = []
for(let i = 0;i<len;i++) {
const cur = list[i]
res.push(cur)
let left = i+1
let right = len
while(left<right) {
const str = list.slice(left,right)
res.push(
cur + str
)
right--
}
}
console.log(res,'resresres')
}
test()
但这个截取的想法我觉得很有趣,自己尝试了一下
const charList = ["A", "B", "C"],
resultList = [];
charList.forEach((char, index) => {
resultList.push(char);
let leftIndex = index + 1,
rightIndex = leftIndex + 1;
while (leftIndex < charList.length) {
resultList.push(char + charList.slice(leftIndex, rightIndex).join(""));
rightIndex++;
if (rightIndex > charList.length) {
leftIndex++;
rightIndex = leftIndex + 1;
}
}
});
console.log(resultList);
结果是['A','AB','ABC', 'AC','B','BC','C']
这个用双指针代替了'我的答案'中 list 的职责,当执行到 A 时候,左边指针从 1 开始,右边指针从 2 开始则取到 B,产出 AB,右边指针加 1 为 3 取道 BC,产出 ABC,右边指针的位置超过长度重置,这时候左边指针从 2 开始,右边指针从 3 开始,取到 C,产出 AC,开始处理 B。
网友评论