【算法题】数组去重排序以及最大差值

前端面试题/算法题

Posted by Jerry on February 3, 2019

常见面试题之一!!!

数组去重

方法一 forEach

var arr = ['1','2','3','4','3','2','6','7','a','b','a'];
const unique = arr => {
    let obj = {};
    arr.forEach(value=>{
        obj[value] = 0;
    })
    return Object.keys(obj);
}
console.log(unique(arr))

方法二 Set

var arr = ['1','2','3','4','3','2','6','7','a','b','a'];
const unique = arr => {
    return new Set(arr)
}
console.log(unique(arr))

方法三 filter

var arr = ['1','2','3','4','3','2','6','7','a','b','a'];
const unique = arr => {
    return arr.filter((el,index,array)=>{
        return index == array.indexOf(el)
    })
}
console.log(unique(arr))

数组排序

即用js语言实现sort()这个方法。

方法一 选择排序,双循环,外层循环固定位置,内层循环找出最小的数。

var arr = [4,9,2,1,8,7,6,3,5];
const sort = arr => {
    arr.forEach((v,i)=>{
        for(let j=i+1;j<arr.length;j++){
            if (arr[i] > arr[j]) {
                [arr[i],arr[j]] = [arr[j],arr[i]]
            }
        }
    })
    return arr;
}
console.log(sort(arr))

方法二 冒泡排序,双循环,外层循环移动游标,内层循环遍历位置,通过相邻位置对比大小换位

var arr = [4,9,2,1,8,7,6,3,5];
const sort = arr => {
    let isSwap;
    for(let i=0;i<arr.length;i++){
        isSwap = false;
        for(let j=0;j<arr.length;j++){
            if(arr[j] > arr[j+1]){
                [arr[j],arr[j+1]] = [arr[j+1],arr[j]];
                isSwap = true;
            }
        }
        if(!isSwap){
            break;
        }
    }
    return arr;
}
console.log(sort(arr))

数组最大差值

方法一:Math.max和Math.min

var arr = [4,42,60,18,28,17,16,33,25];
const difference = arr => {
    return Math.max(...arr) - Math.min(...arr);
}
console.log(difference(arr))

方法二:单循环,用变量max和min保存最大值和最小值,求差

var arr = [4,42,60,18,28,17,16,33,25];
const difference = arr => {
    let max = arr[0],min = arr[0];
    for(let i=1;i<arr.length;i++){
        max = arr[i] > max ? arr[i] : max;
        min = arr[i] < min ? arr[i] : min;
    }
    return max - min;
}
console.log(difference(arr))