2025-08-27 模拟面试(十)

题目 1:扁平化嵌套数组并求和(加权和)

题目描述: 实现一个函数 flattenAndSum(arr, depth = Infinity),它可以扁平化一个多维整数数组,并根据其深度计算加权和。 加权规则:每个元素的值为 元素值 * (最大深度 - 当前深度 + 1)。 深度从 1 开始计数(即最外层的深度为 1)。

示例:

const arr = [1, [2, [3, 4], 5], 6];
// 最大深度为3
// 1 (深度1) -> 1 * (3-1+1) = 3
// 2 (深度2) -> 2 * (3-2+1) = 4
// 3 (深度3) -> 3 * (3-3+1) = 3
// 4 (深度3) -> 4 * (3-3+1) = 4
// 5 (深度2) -> 5 * (3-2+1) = 10
// 6 (深度1) -> 6 * (3-1+1) = 18
// 总和: 3 + 4 + 3 + 4 + 10 + 18 = 42

console.log(flattenAndSum(arr)); // 应输出 42

// 用数组来存放递归后的数据,递归可以计算出每个数据的层数,最后计算这个数组即可算出结果
function flattenAndSum(list) {
  var arr = [];
  var result = 0;
  var maxDeep = 1;
  function fn(list, deep = 1) {
    maxDeep = Math.max(maxDeep, deep);
    list.forEach((item, index) => {
      if (Array.isArray(item)) {
        fn(item, deep + 1);
      } else {
        arr.push({
          value: item,
          deep: deep,
        });
      }
    });
  }
  fn(list);
  for (var i of arr) {
    var sum = i.value * (maxDeep - i.deep + 1);
    result += sum;
  }
  return result;
}

题目 2:大数相加

题目描述: 实现一个函数 bigNumberAdd,入参为 2 个字符串数字,返回字符串数字和。

示例:

var a = "1234";
var b = "2345";

console.log(bigNumberAdd(a, b)); // 3579

function bigNumberAdd(a, b) {
  var str = "";
  var carry = 0;
  if (a.length > b.length) {
    b = b.padStart(a.length, "0");
  } else {
    a = a.padStart(b.length, "0");
  }
  for (let i = a.length - 1; i >= 0; i--) {
    var sum = a[i] - 0 + (b[i] - 0);
    // 需要注意的是:相加大于9,必须前进一位,如果当前已经进了一位,而相加又大于9,所以相当于进了2位
    if (sum > 9) {
      if (carry) {
        str += sum - 9;
      } else {
        str += sum - 10;
      }
      carry = 1;
    } else {
      if (carry) {
        str += sum + 1;
      } else {
        str += sum;
      }
      carry = 0;
    }
  }
  // 如果2个大数的第一个数字相加大于了9,那么还得前面补个1
  if (a[0] - 0 + (b[0] - 0) > 9) {
    str += "1";
  }
  return str.split("").reverse().join("");
}

题目 3:查找出现一次的数字

/*
    给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。
    找出那个只出现了一次的元素。
    你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
    示例 1 :
    输入:nums = [2,2,1]
    输出:1
    示例 2 :
    输入:nums = [4,1,2,1,2]
    输出:4
    示例 3 :
    输入:nums = [1]
    输出:1
    */

// 核心思路是把数据放到数组中,如果数组之前已经存在了,那么就把这个数字删除掉
function findOnce(list) {
  var target = [];
  list.forEach((item) => {
    var index = target.indexOf(item);
    if (index > -1) {
      target.splice(index, 1);
    } else {
      target.push(item);
    }
  });
  return target[0];
}

console.log(findOnce([4, 1, 2, 1, 2, 4, 5, 6, 5]));
console.log(findOnce([4, 1, 2, 1, 2]));
console.log(findOnce([1]));

题目 4:查找独一无二的数

/*
    给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
    如果每个数的出现次数都是独一无二的,
    就返回 true;否则返回 false。

    示例 1:
    输入:arr = [1,2,2,1,1,3]
    输出:true
    解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。
    示例 2:

    输入:arr = [1,2]
    输出:false
    示例 3:

    输入:arr = [-3,0,1,-3,1,1,1,-3,10,0]
    输出:true
    */
function unique(list) {
  var result = {};
  list.forEach((item) => {
    if (result[item]) {
      result[item] += 1;
    } else {
      result[item] = 1;
    }
  });
  var tempList = Object.values(result);
  return tempList.length === new Set(tempList).size;
}

console.log(unique([1, 2, 2, 1, 1, 3])); // true
console.log(unique([1, 2])); // false
console.log(unique([-3, 0, 1, -3, 1, 1, 1, -3, 10, 0])); // true

题目 5:查找幸运数

/*
示例 2:
输入:arr = [1,2,2,3,3,3]
输出:3
解释:1、2 以及 3 都是幸运数,只需要返回其中最大的 3 。
*/
function luckyNum(list) {
  if (list.length === 1) {
    return list[0];
  }
  var result = {};
  var target = -1;
  list.forEach((item) => {
    if (result[item]) {
      result[item] += 1;
      target = result[item] === item ? item : -1;
    } else {
      result[item] = 1;
    }
  });
  return target;
}
console.log(luckyNum([1, 2, 2, 3, 3, 3])); // 3
console.log(luckyNum([1])); // 1
console.log(luckyNum([2, 2, 3, 4])); // 2
console.log(luckyNum([2, 2, 2, 3, 3])); // -1
console.log(luckyNum([7, 7, 7, 7, 7, 7, 7])); // 7

题目 6:唯一元素和

/*
示例 1:
输入:nums = [1,2,3,2]
输出:4
解释:唯一元素为 [1,3] ,和为 4 。

示例 2:
输入:nums = [1,1,1,1,1]
输出:0
解释:没有唯一元素,和为 0 。
*/
// 核心思路是累加,碰到重复的就减掉。用对象存储来表示是否有重复数字。
function onlyNum(list) {
  var result = {};
  var num = 0;
  list.forEach((item) => {
    if (result[item]) {
      num -= item;
      result[item] += 1;
    } else {
      result[item] = 1;
      num += item;
    }
  });
  return num < 0 ? 0 : num;
}

console.log(onlyNum([1, 2, 3, 2])); //4
console.log(onlyNum([1, 1, 1, 1])); // 0
console.log(onlyNum([1, 2, 3, 4, 5])); // 15
console.log(onlyNum([1, 2, 2, 3, 3])); // 1

results matching ""

    No results matching ""