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