小于N的最大数
题目内容:给一个目标数和一个数组,数组内的数都是个位数,且可以重复使用,返回一个小于目标数N的最大数。
基本思路:
先按目标数N的位数从高位到低位找,如果在数组中能找到与某位数相等的数,则将其推进数组,如果没找到,则从数组剩余数里面挑其次,有其次就找其次,且从该位开始后面可以直接push数组中最大的数了;如果没有其次,那么说明需要回退上一位(pop),找到上一位的其次,循环直到res拿到结果,走 break 跳出循环。
const getNum = (target, arr) => {
let str = target + "";
arr.sort((a, b) => b - a);
let res = [];
for (let i = 0; i < str.length; i++) {
let tmp = parseInt(str[i]);
// 注意规避输出相等数的情况,最后一位强制求其次
if (arr.includes(tmp) && i !== str.length - 1) {
res.push(tmp);
} else {
while (1) {
const rest = arr.filter((item) => item < tmp);
if (rest.length) {
res.push(rest[0]);
const l = res.length;
for (let j = 0; j < str.length - l; j++) {
res.push(arr[0]);
}
break;
} else {
if (!res.length) {
// 首位
for (let k = 0; k < str.length - 1; k++) {
res.push(arr[0]);
}
break;
} else {
// 非首位
tmp = res.pop();
}
}
}
break;
}
}
return parseInt(res.join(""));
};