小于N的最大数

967 阅读1分钟

小于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(""));
};