數(shù)組的一些面試題


說(shuō)在前面的話:
數(shù)組的concat,join,slice,toString方法不會(huì)改變?cè)瓟?shù)組。
數(shù)組的splice,push,pop,unshift,shift,sort,reverse方法會(huì)改變?cè)瓟?shù)組。

1. 數(shù)組求和

要求:計(jì)算給定數(shù)組的所有元素的總和,數(shù)組的元素均為Numeber,不考慮其它類型。

方法一:常規(guī)遍歷相加
for,for in, for of, forEach都可以遍歷數(shù)組!這里我用了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]))

關(guān)于for循環(huán)的作用域問(wèn)題可以參考我的另一篇博客ES6總結(jié)

方法二: 遞歸!

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() 方法接收一個(gè)函數(shù)作為累加器,數(shù)組中的每個(gè)值(從左到右)開(kāi)始縮減,最終計(jì)算為一個(gè)值。
reduce/map,filter,sort都是高階函數(shù)!可以接受函數(shù)作為參數(shù)?。ńo高階大佬們倒茶?。╆P(guān)于用法我將專門寫一篇來(lái)說(shuō)。

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()
(發(fā)音:哎喔~~ )eval接受字符串,并計(jì)算其javascript代碼。黑科技啊有木有!但是不推薦用!

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

2. 數(shù)組求最大值

其實(shí)數(shù)組的一些操作變來(lái)變?nèi)ゾ湍切?。以不變?yīng)萬(wàn)變,多寫寫,多思考,熟練了這些方法基本就可以應(yīng)付一切數(shù)組的問(wèn)題了!
方法一: for循環(huán)遍歷
簡(jiǎn)單!取第一個(gè)元素,遍歷數(shù)組的元素挨個(gè)比較,取最大值!

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()
思路很簡(jiǎn)單,從大到小排序然后第一個(gè)元素就是最大值咯?。ㄟ@里我不明白為什么sort接受這樣一個(gè)函數(shù)就可以實(shí)現(xiàn)排序了呢?容我研究研究~~)

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()
這個(gè)就很有意思了,apply可以劫持另一個(gè)對(duì)象的方法,也就是說(shuō)可以繼承這個(gè)方法!這里第一個(gè)參數(shù)null只是表示一個(gè)占位符。類似的有Array.prototy.push.apply(arr1, arr2)??梢岳斫鉃閍rr1劫持了push方法,傳入?yún)?shù)arr2。即為arr1.push(arr2)。apply方法已經(jīng)將arr2數(shù)組轉(zhuǎn)換為參數(shù)列表,call跟apply的用法差不多,call是apply的語(yǔ)法糖。(我在考慮要不要單獨(dú)寫一偏關(guān)于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()
(還是這個(gè)鬼東西!) 不廢話!上代碼!

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

在這里,arr不需要轉(zhuǎn)換成字符串再相加,因?yàn)榧犹?hào)可以隱式的將數(shù)組對(duì)象轉(zhuǎn)成字符串。

3. 數(shù)組合并

//concat 這個(gè)不用解釋了,簡(jiǎn)單粗暴
function concat(arr1, arr2) {
        return arr = arr1.concat(arr2)
    }
    
//slice和push 深拷貝一份arr1,遍歷arr2,push進(jìn)去就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循環(huán)遍歷,分別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. 數(shù)組中元素的相關(guān)操作

1.移除數(shù)組 arr 中的所有值與 item 相等的元素,直接在給定的 arr 數(shù)組上進(jìn)行操作,并將結(jié)果返回

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]

注意!因?yàn)閟plice會(huì)改變?cè)瓟?shù)組的長(zhǎng)度,所以每次刪除之后i-1;在這里不能用for in循環(huán)。因?yàn)閒or in會(huì)遍歷對(duì)象的所有可枚舉屬性,并且原型上的屬性也會(huì)被訪問(wèn)到,只要這個(gè)屬性是存在并且可枚舉的,他就會(huì)給你全部打印出來(lái)。而且for in性能最差,所以對(duì)于數(shù)組最好用for循環(huán),處理對(duì)象用for in.
鏈接:for in循環(huán)和for循環(huán)的區(qū)別

2.在數(shù)組 arr 中,查找值與 item 相等的元素出現(xiàn)的所有位置

//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.找出數(shù)組 arr 中重復(fù)出現(xiàn)過(guò)的元素

//雙層遍歷。
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 ) { //判斷是否重復(fù),是否放進(jìn)新數(shù)組
                    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))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容