(携程)算法手写题

346 阅读3分钟

今天在掘金上看到有一道面试题,我感觉很有意思就准备自己写一下,不管写的怎么样;先看看自己是否能写出来嘛?然后带着这个心态开始了写大厂面试题;哈哈哈

以下是这个作者整理的一些面试题,大家如果需要的话可以看看

【1 月最新】前端 100 问:能搞懂 80% 的请把简历给我

问题

已知如下数组: var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; 编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组

分析

拿到一个问题,我们先分析一下这个问题需要用什么样的逻辑去写,然后再根据自己理出来的逻辑一步一步去实现他即可!!!

  • 题目第一步就说了需要扁平化数据,那这就没得说的了;先扁平化数组(这儿大家可能会想到内置api-flat,既然叫我们挑战,那我们就不使用内置api了,就手动写一个)
  • 去重
  • 排序

这个问题大致就这三步即可完成,那么我们就一步一步的去做吧!

数组扁平化

这儿比较简单;我利用了reduce函数去判断是否是一个数组,如果是就递归,反之合并数组数据,即可

代码:

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

// 扁平化
const flat = (arr) =>{
    return arr.reduce((one,pro)=>{return one.concat(Array.isArray(pro) ? flat(pro) : pro)},[])
};

const flatSize = flat(arr); 

结果:

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

去重

去重的时候我也是利用的reduce方法,然后将重复的数字替换掉,最后在返回数据的时候用过滤器filter将替换的那些给过滤掉即可

代码:

const deWeight = (arr) =>{
    const weight = arr.reduce((one,pro)=>{return one.concat(one.some(oi=>oi == pro) ? 'pro' : pro)},[]);
    return weight.filter(o=>o !== 'pro');
};

const deWeightSize = deWeight(flatSize);

结果:

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

排序

排序我用的是选择排序的方式,这个没什么说的,我相信大家都有所了解,看哈代码就知道怎么做的了!!!

代码:

// 选择排序

const sort = (arr) =>{

    for(let i = 0; i < arr.length - 1; i++) {

        let indexMin = i;
        for(let j = i + 1; j < arr.length; j++) {
            if(arr[i] > arr[j]){
                indexMin = j;
            }
        }
        if(indexMin !== i) {
            let tp = arr[i];
            arr[i] = arr[indexMin];
            arr[indexMin] = tp;
        }
    };

    return arr;
};

结果:

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

完整代码



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

// 扁平化

const flat = (arr) =>{
    return arr.reduce((one,pro)=>{return one.concat(Array.isArray(pro) ? flat(pro) : pro)},[])
};


const flatSize = flat(arr);

// 去重

const deWeight = (arr) =>{
    const weight = arr.reduce((one,pro)=>{return one.concat(one.some(oi=>oi == pro) ? 'pro' : pro)},[]);
    return weight.filter(o=>o !== 'pro');
};

const deWeightSize = deWeight(flatSize);

// 选择排序
const sort = (arr) =>{
    for(let i = 0; i < arr.length - 1; i++) {

        let indexMin = i;
        for(let j = i + 1; j < arr.length; j++) {
            if(arr[i] > arr[j]){
                indexMin = j;
            }
        }
        if(indexMin !== i) {
            let tp = arr[i];
            arr[i] = arr[indexMin];
            arr[indexMin] = tp;
        }
    };

    return arr;
};

console.log(sort(deWeightSize));

我写的这个可能有很多不足的地方,也是临时起意;望大家理解哈!!!

如果你们有更好的方法,也可以贴出来分享一哈,相互学习进步