阿里与字节跳动前端算法面试题

1头条:数组扁平滑处理以下是几种解决方案:

let arr = [
    [1, 2, 2],
    [3, 4, 5, 5],
    [6, 7, 8, 9, [11, 12, [12, 13, [14]]]], 10
];

/*方案1:使用 Array.prototype.flat 处理*/
arr = arr.flat(Infinity);

/*方案2:把数组直接变为字符串即可*/
arr = arr.toString().split(',').map(item => {
     
    return Number(item);
});

/*方案3:JSON.stringify*/
arr = JSON.stringify(arr).replace(/(\[|\])/g, '').split(',').map(item => Number(item));

/*方案4:基于数组的some方法进行判断检测*/
while (arr.some(item => Array.isArray(item))) {
     
    arr = [].concat(...arr);
}

/*方案5:基于递归深度遍历*/
Array.prototype.myFlat = function myFlat() {
     
    let result = [];
    //=>循环数组中的每一项,把不是数组的存储到新数组中
    let fn = (arr) => {
     
        for (let i = 0; i < arr.length; i++) {
     
            let item = arr[i];
            if (Array.isArray(item)) {
     
                fn(item);
                continue;
            }
            result.push(item);
        }
    };
    fn(this);
    return result;
}

2头条:所有和为N的连续正数序列

/*
 * 输入一个正数N,输出所有和为N的连续正数序列
 * 例如:输入15
 * 结果:[[1,2,3,4,5],[4,5,6],[7,8]]
 */
function createArr(n,len){
     
    let arr=new Array(len).fill(null),
        temp=[];
    arr[0]=n;
    arr=arr.map((item,index)=>{
        if(item===null){
            item=temp[index-1]+1;
        }
        temp.push(item);
        return item;
    });
    return arr;
}
function fn(count){
    let result=[];
    //=>求出中间值
    let middle=Math.ceil(count/2);
    //1开始累加
    for(let i=1;i<=middle;i++){
        //控制累加多少次
        for(let j=2;;j++){
            //求出累加多次的和
            let total=(i+(i+j-1))*(j/2);
            if(total>count){
     
                break;
            }else if(total===count){
     
                result.push(createArr(i,j));
                break;
            }
        }
    }
    return result;
}

3头条:数组中找出和为N的两个整数

/* 
 * 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标
 * nums = [1,6,4,8,7];
 * target = 9
 * => nums[0] + nums[3] = 9
 * => [0,3]
 */

/*方案1:暴力法(遍历每个元素 x,并查找是否存在一个值与 target - x 相等的目标元素)*/
function func(nums, target) {
     
    for (let i = 0; i < nums.length - 1; i++) {
     
        let item = nums[i],
            diff = target - item;
        for (let j = i + 1; j < nums.length; j++) {
     
            if (nums[j] === diff) {
     
                return [i, j];
            }
        }
    }
}

/*方案2:对象键值对*/
function func(nums, target) {
     
    let temp = {
     };
    for (let i = 0; i < nums.length; i++) {
     
        let item = nums[i],
            diff = target - item;
        if (temp[diff] !== undefined) {
     
            return [temp[diff], i];
        }
        temp[item] = i;
    }
}

4阿里:具有最大和的连续子数组

function maxSubArray(nums) {
     
    let ans = nums[0],
        sum = 0;
    for (let i = 0; i < nums.length; i++) {
     
        let item = nums[i];
        if (sum > 0) {
     
            sum += item;
        } else {
     
            sum = item;
        }
        ans = Math.max(ans, sum);
    }
    return ans;
}
console.log(maxSubArray([-2, 2, -1, 1, -3]));

5阿里:合并两个有序数组

// O((n+m)*log(n+m))
function merge(nums1, nums2) {
     
    return nums1.concat(nums2).sort((a,b)=>a-b);
}

// O(m+n)
function merge(nums1, nums2) {
    let len1 = nums1.length - 1;
    let len2 = nums2.length - 1;
    let len = nums1.length + nums2.length - 1;
    while (len1 >= 0 && len2 >= 0) {
        let val1 = nums1[len1],
            val2 = nums2[len2];
        if (val1 > val2) {
            nums1[len] = val1;
            len1--;
        } else {
            nums1[len] = val2;
            len2--;
        }
        len--;
    }
    return nums1;
};
console.log(merge([1, 5, 8, 16, 26], [4, 7, 9, 17]));

6阿里:斐波那契数列

/*
 * 实现一个fibonacci [ˌfɪbəˈnɑːtʃi] 函数,实现以下的功能:
 * 斐波那契数列为:[1,1,2,3,5,8,13,21,…]
 * fibonacci(0) -> 1
 * fibonacci(4) -> 5
 */
function fibonacci(count) {
     
    if (count <= 1) return 1;
    let arr = [1, 1],
        n = count + 1 - 2; //=>要创建的数量
    while (n > 0) {
     
        let cur = arr[arr.length - 2],
            next = arr[arr.length - 1];
        arr.push(cur + next);
        n--;
    }
    return arr[arr.length - 1];
}

如果对大家有帮助,希望大家动动自己的小手给我一个赞。

你可能感兴趣的:(算法,前端,javascript)