记录一下字节面试遇到的两道编程题

实现一下数组的filter方法

题目:实现一下数组的filter方法

这里需要直接在数组原型上绑定方法,同时需要注意filter参数支持传入的参数以及其顺序,第一个参数是当前元素,第二个参数是下标,第三个参数是当前数组

我的实现是这样的:

Array.prototype.myFilter = function (fn) {
// 调用错误处理
if (!Array.isArray(this)) {
throw new Error('Function myFilter must be called by an array!')
}
// 传参错误处理
if (typeof fn !== 'function') {
throw new TypeError(`${fn} must be a function!`)
}
const res = [];
const arr = this;
for (let i = 0; i < arr.length; i++) {
// 注意filter方法可以传入多个参数
const temp = fn(arr[i], i, arr);
if (temp) {
res.push(arr[i]);
}
}
return res;
}

const a1 = [2, 3, 4, 5, 6, 7, 8];
const fn = (el, i) => {
return el > 4;
}
console.log('数组原生filter结果:', a1.filter(fn)); // [5, 6, 7, 8]
console.log('自定义filter结果:', a1.myFilter(fn)); // [5, 6, 7, 8]

大数字符串求和

题目:strA = ‘123456’, strB = ‘22345’, 实现一个方法,返回两个数的和,不使用Number方法直接转换相加,整数类型的数字,且首尾不会出现0

解决思路:首先将字符串拆成数组,并且按照个位在前,高数位数字在后的顺序保存,然后遍历两个数组,将各个数位上的数值求和,注意处理满10向下一数位进1的逻辑,最终得到一个求和之后各个数位的数组,最终使用各个数位上的数累加求出最终结果

代码实现:

function strNumberAdd(a, b){
let res = 0;
// 数字字符串拆分,将字符串按照从各位到高位的顺序存进数组
function splitNum(str){
const numArr = [];
const arr = str.split('');
for (let i = arr.length - 1; i >= 0; i--) {
numArr.push(arr[i]);
}
return numArr;
}

// 拆分两部分数字
const aArr = splitNum(a);
const bArr = splitNum(b);

const aLen = aArr.length;
const bLen = bArr.length;
const len = Math.max(aLen, bLen);

const sumArr = [];
let temp = 0; // 用来存储前一位求和大于10向下一位进位的
// 遍历各位,分别求和,存入sumArr
for (let j = 0; j < len; j++) {
if (j < Math.min(aLen, bLen)) {
// 求和,如果有进位的,也要加上,加完temp重置为0
sumArr[j] = Number(aArr[j]) + Number(bArr[j]) + temp;
} else {
let num;
if (aLen > bLen) {
num = Number(aArr[j]);
} else if(aLen === bLen){
num = Number(aArr[j]) + Number(bArr[j]);
} else {
num = Number(bArr[j]);
}

sumArr[j] = num + temp;
}
// temp加完后重置为0
temp = 0;
// 求和超过10向下一位进1
if (sumArr[j] >= 10) {
sumArr[j] = sumArr[j] % 10;
temp = 1;
}
}
console.log('各个数位上的数字求完和之后的数组是', sumArr);

// 遍历sumArr,按照各位数上的数字相加求和
for (let k = 0; k < sumArr.length; k++) {
const val = sumArr[k];
res += Number(`${val}e${k}`);
}

return res;
}

// 测试正确性
const a = strNumberAdd('126435', '2584327');
console.log('实现的函数计算出来a的值是:', a); // 实现的函数计算出来a的值是:2710762
console.log('事实上a的值应该是126435 + 2584327 = ', 126435 + 2584327); // 事实上a的值应该是126435 + 2584327 = 2710762

这样实现之后,感觉还有点问题,如果最终的和还是溢出的话,这样也不行,是不是最终的结果要转换成科学计数法表示?