拼接最大回文数

92 阅读1分钟

题目

image.png

  • 首先收集所有出现次数大于1的数,然后先取其中最大的数,如果次数为2的倍数,则每次取两个放到首尾->首+1、尾-1->首-2、尾-2的位置,...,然后为奇数,则减到1后,记录该值;然后对第二大的数继续该操作,最后往回文串中间添加记录到减到1时的最大的值
  • 如果只有 0 是重复出现的数,那么只需要返回数组中最大的数即可

image.png

image.png

function process(arr) {
  // 是否只有 0 是重复出现的
  let onlyZero = true;
  let obj = {},
    res,
    midMax = -1;
  arr = arr.sort((a, b) => b - a);
  for (let i = 0; i < arr.length; i++) {
    if (obj[i]) {
      if (i !== 0) {
        onlyZero = false;
      }
      obj[i]++;
    } else {
      obj[i] = 0;
    }
  }

  if (!onlyZero) {
    for (let i = 0; i < arr.length; i++) {
      let count = obj[i],
        mid,
        res = "";
      while (count != 1) {
        mid = Math.floor(res / 2);
        let left = res.substring(0, mid);
        let right = res.substring(mid, res.length);
        res = left + i + i + right;
        count = count - 2;
      }
      if (count === 1) {
        if (midMax === -1) {
          midMax = i;
        }
      }
    }
    mid = Math.floor(res / 2);
    let left = res.substring(0, mid);
    let right = res.substring(mid, res.length);
    if (midMax !== -1) {
      res = left + midMax + right;
    }
  } else {
    res = arr[0] + "";
  }

  return res;
}