您的当前位置:首页正文

数组的一些面试题

来源:华佗小知识

说在前面的话:
数组的concat,join,slice,toString方法不会改变原数组。
数组的splice,push,pop,unshift,shift,sort,reverse方法会改变原数组。

1. 数组求和

要求:计算给定数组的所有元素的总和,数组的元素均为Numeber,不考虑其它类型。

方法一:常规遍历相加
for,for in, for of, forEach都可以遍历数组!这里我用了for in

function sum (arr) {
    var res = 0;
    for (var i in arr){
        res += arr[i]
    }
    return res
}
console.log(sum([1, 2, 3, 4]))
var arr = [1, 2, 3, 4, 9]
    function sum(arr) {
        var len = arr.length;
        if (len == 0) {
            return 0
        } else if (len == 1) {
            return arr[0]
        } else {
            return arr[0] + sum(arr.slice(1))
        }
    }
    console.log(sum(arr))

方法三: reduce()
reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce/map,filter,sort都是高阶函数!可以接受函数作为参数!(给高阶大佬们倒茶!)关于用法我将专门写一篇来说。

var arr = [1, 2, 2, 3, 22, 2]
function sum (arr) {
    var res = arr.reduce(function (total, num) {
        return  total + num
    })
    return res
}
console.log(sum(arr))

方法四: eval()
(发音:哎喔~~ )eval接受字符串,并计算其javascript代码。黑科技啊有木有!但是不推荐用!

var arr = [1, 2, 3, 4, 5];
function sum(arr) {
    return eval(arr.join('+'))
}
console.log(sum(arr))

2. 数组求最大值

其实数组的一些操作变来变去就那些。以不变应万变,多写写,多思考,熟练了这些方法基本就可以应付一切数组的问题了!
方法一: for循环遍历
简单!取第一个元素,遍历数组的元素挨个比较,取最大值!

var arr = [1, 2, 3, 4, 9]
    function max(arr) {
        var res = arr[0]
        for (var i in arr) {
            res = Math.max(res, arr[i])
        }
        return res
    }
    console.log(max(arr ))

方法二: sort()和reverse()
思路很简单,从大到小排序然后第一个元素就是最大值咯!(这里我不明白为什么sort接受这样一个函数就可以实现排序了呢?容我研究研究~~)

var arr = [1, 2, 3, 4]
var res = arr.sort((a, b) => b - a)[0]
console.log(res)
var res = arr.sort((a, b) => a - b).reverse()[0]

方法三: Math.max()
这个就很有意思了,apply可以劫持另一个对象的方法,也就是说可以继承这个方法!这里第一个参数null只是表示一个占位符。类似的有Array.prototy.push.apply(arr1, arr2)。可以理解为arr1劫持了push方法,传入参数arr2。即为arr1.push(arr2)。apply方法已经将arr2数组转换为参数列表,call跟apply的用法差不多,call是apply的语法糖。(我在考虑要不要单独写一偏关于apply,call,bind的用法)

var arr = [1, 2, 3, 4]
console.log(Math.max.apply(null, arr))

方法四: reduce()

var arr = [1, 2, 2, 3, 22, 2]
var max = arr.reduce(function (a, b) {return a > b ? a : b})
console.log(max)

方法五: eval()
(还是这个鬼东西!) 不废话!上代码!

 var arr = [1, 2, 3, 4]
 var max = eval('Math.max(' + arr + ')')
 console.log(max) //4

在这里,arr不需要转换成字符串再相加,因为加号可以隐式的将数组对象转成字符串。

3. 数组合并

//concat 这个不用解释了,简单粗暴
function concat(arr1, arr2) {
        return arr = arr1.concat(arr2)
    }
    
//slice和push 深拷贝一份arr1,遍历arr2,push进去就OK了!
function concat(arr1, arr2) {
            var arr = arr1.slice(0);
            for (var i in arr2) {
                arr.push(arr2[i])
            }
            return arr      
        }
        var arr1 = [1, 2];
        var arr2 = [3, 4];
        console.log(concat(arr1, arr2))
        
//slice,push,apply 跟上面用法差不多
function concat(arr1, arr2) {
            var arr = arr1.slice(0);
            Array.prototype.push.apply(arr, arr2)//[].push.apply(arr, arr2)也可以
            return arr      
        }
        var arr1 = [1, 2];
        var arr2 = [3, 4];
        console.log(concat(arr1, arr2))
        
//for循环遍历,分别push
function concat(arr1, arr2) {
            var arr = [];
            for (var i in arr1) {
                arr.push(arr1[i])
            }
            for (var j in arr2) {
                arr.push(arr2[j])
            }
            return arr  
        }
        var arr1 = [1, 2];
        var arr2 = [3, 4];
        console.log(concat(arr1, arr2))

4. 数组中元素的相关操作

1.移除数组 arr 中的所有值与 item 相等的元素,直接在给定的 arr 数组上进行操作,并将结果返回

var arr = [1, 2, 2, 3, 4, 2]
    function sum(arr, item) {
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] == item) {
                 arr.splice(i, 1)
                 i--
            }
        }
        return arr
    }   
    console.log(sum(arr, 2))    // [1, 3, 4]
    console.log(arr)    //[1, 3, 4]

2.在数组 arr 中,查找值与 item 相等的元素出现的所有位置

//forEach
var arr = [1, 2, 2, 3, 4, 2]
function fn(arr, item) {
    var res = [];
    arr.forEach(function (value, index) {
        return value !== item || res.push(index) //value == item && res.push(index)
    })
    return res
}   
console.log(fn(arr, 2)) //[1, 2, 5]

3.找出数组 arr 中重复出现过的元素

//双层遍历。
var arr = [1, 2, 2, 3, 22, 2]
    function sum (arr) {
        var res = [];
        for (var i = 0; i <arr.length-1; i++) {
            for (var j = i + 1; j < arr.length; j++) {
                if (arr[i] === arr[j] && res.indexOf(arr[i]) == -1 ) { //判断是否重复,是否放进新数组
                    res.push(arr[i])
                }
            }
        }
        return res
    }
    console.log(sum(arr))
//sort排序后遍历相邻的
var arr = [1, 2, 2, 3, 22, 2]
    function sum (arr) {
        var res = [];
        arr.sort();
        for (var i = 0; i < arr.length; i++) {
            if (arr[i] === arr[i+1] && res.indexOf(arr[i]) == -1) {
                res.push(arr[i])
            }
        }
        return res
    }
    console.log(sum(arr))
//filter
var arr = [1, 2, 2, 3, 22, 2]
    function sum (arr) {
        return arr.sort().filter(function(item, i) {
            return arr[i] == arr[i+1] && arr[i] !== arr[i-1]
        })
    }
    console.log(sum(arr))