数组面试题

304 阅读1分钟

遇到的一道数组题

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

思路

根据题目,分为三步:

  1. 扁平化
  2. 去重
  3. 排序

实现

ES5

// 拉平
function flattern(arr) {
    if (Object.prototype.toString.call(arr).slice(8, 13) != "Array") {
        return
    }
    if (arr.length <= 1) {
        return arr
    }
    var res = []
    arr.forEach(element => {
        if (element.length) {
            res.push(...flattern(element))
        } else {
            res.push(element)
        }
    });
    return res
}
// 去重
function unique(arr) {
    if (Object.prototype.toString.call(arr).slice(8, 13) != "Array") {
        return
    }
    if (arr.length <= 1) {
        return arr
    }
    var res = []
    for (let index = 0; index < arr.length; index++) {
        var element = arr[index];
        if (res.indexOf(element) === -1) {
            res.push(element)
        }
    }
    return res
}

// 排序
// 排序算法大家都很熟悉,这里只列以下几种
// 1.冒泡排序
function bubbleSort(arr) {
   if (Object.prototype.toString.call(arr).slice(8, 13) != "Array") {
        return
   } 
   for (var i = 0; i < arr.length - 1; i++) {
        for (var n = 0; n < arr.length - 1; n++) {
            if (arr[n] > arr[n + 1]) {
                var temp = 0
                temp = arr[n]
                arr[n] = arr[n + 1]
                arr[n + 1] = temp
            }
        }
    }
    return arr
}
// 2.快速排序
function quickSort(arr) {
    if (Object.prototype.toString.call(arr).slice(8, 13) != "Array") {
        return
    }
    if (arr.length > 1) {
        var mid = arr[0]
        var left = [],
            right = []

        for (var index = 1; index < arr.length; index++) {
            if (arr[index] < mid) {
                left.push(arr[index])
            } else {
                right.push(arr[index])
            }
        }
        return quickSort(left).concat(mid, quickSort(right))

    } else {
        return arr
    }
}
//3.选择排序
function selectionSort(arr) {
    if (Object.prototype.toString.call(arr).slice(8, 13) != "Array") {
        return
    }
    var len = arr.length;
    var minIndex, temp;
    for (var i = 0; i < len - 1; i++) {
        minIndex = i;
        for (var j = i + 1; j < len; j++) {
            if (arr[j] < arr[minIndex]) {    
                minIndex = j;                
            }
        }
        temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }
    return arr;
}
//4.插入排序
function insertSort(arr) {
    if (Object.prototype.toString.call(arr).slice(8, 13) != "Array") {
        return
    }
    for (var index = 1; index < arr.length; index++) {
        var temp = arr[index]
        for (var i = index - 1; i >= 0; i--) {
            if (arr[i] > temp) {
                arr[i + 1] = arr[i]
            } else {
                arr[i + 1] = temp
                break
            }
        }
    }
    return arr
}

ES6

function formatByES6(arr) {
    if (!Array.isArray(arr)) return
    return new Array(...new Set(arr.flat(Infinity))).sort((pre, next) => {
        return pre - next
    })
}