(二)有关数组的面试题

数组去重(常考)

方法一(暴力)
var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];

function deleteItem(arr) {
    for (let i = 0; i < arr.length; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[i] == arr[j]) {
                arr.splice(j, 1)
                j--
            }
        }
    }
    return arr
}
console.log(deleteItem(arr)) //[ 1, 23, 3, 5, 6, 7, 9, 8 ]
方法二
借助indexOf()方法判断此元素在该数组中首次出现的位置下标与循环的下标是否相等
var ar = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
function rep2(arr) {
    for (var i = 0; i < arr.length; i++) {
        if (arr.indexOf(arr[i]) != i) {
            arr.splice(i, 1); //删除数组元素后数组长度减1后面的元素前移
            i--; //数组下标回退
        }
    }
    return arr;
}
rep2(ar);
console.log(ar); //[ 1, 23, 3, 5, 6, 7, 9, 8 ]
方法三
利用数组中的filter方法
var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];
let a = arr.filter(function(element, index, self) {
    return self.indexOf(element) === index;
})
console.log(a) //[ 1, 23, 3, 5, 6, 7, 9, 8 ]
方法四
利用空对象来记录新数组中已经存储过的元素
var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];

function re(arr) {
    let obj = {}
    let arr1 = []
    for (let i = 0; i < arr.length; i++) {
        if (!obj[arr[i]]) {
            arr1.push(arr[i])
            obj[arr[i]] = true
        }
    }
    return arr1
}
console.log(re(arr)) //[ 1, 23, 3, 5, 6, 7, 9, 8 ]
方法五
借助新数组 判断新数组中是否存在该元素如果不存在则将此元素添加到新数组中
var arr = [1, 23, 1, 1, 1, 3, 23, 5, 6, 7, 9, 9, 8, 5];

function re1(arr) {
    let arr1 = []
    for (let i = 0; i < arr.length; i++) {
        if (arr1.indexOf(arr[i]) == -1) {
            arr1.push(arr[i])
        }
    }
    return arr1
}
console.log(re1(arr)) //[ 1, 23, 3, 5, 6, 7, 9, 8 ]

去重的方法很多,这里列举具有代表性的几个

一、将字符串反向 ‘abc123’ => ‘321cba’

第一种:利用for循环
let str = "abc"
let str1 = ""
for (let i = 0; i < str.length; i++) {
    str1 += str.charAt(str.length - 1 - i)
}
console.log(str1) //cba
第二种 :利用数组的reverse
let str = "abc123"
console.log(str.split("").reverse().join("")) //321cba

二、打平嵌套数组 [1, [2, [3], 4], 5] => [1, 2, 3, 4, 5]

let arr = [1, [2, [3], 4], 5]
console.log(arr.toString().split(",").map(item => Number(item))) //[ 1, 2, 3, 4, 5 ]


const arr = [1, [2, [3], 4], 5]
console.log(JSON.parse(`[${arr}]`)) //[ 1, 2, 3, 4, 5 ]

三、打印数组全排列

[1,2,3] => [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
function allRange(arr, path, res) {
    if (!arr.length) {
        res.push(path)
        return
    }
    arr.forEach((v, idx) => {
        const t = arr.slice()
        const p = path.slice()
        t.splice(idx, 1)
        p.push(v)
        allRange(t, p, res)
    })
}
var a = [1, 2, 3, 4]
const b = []
allRange(a, [], b)
console.log(b)

四、寻找两个有序数组最小相同元素

游标法

const a = [1, 2, 5, 9, 10]
const b = [2, 3, 4, 6, 9, 10]

function finmix(arr1, arr2) {
    let i = 0;
    let j = 0;
    while (i < arr1.length || j < arr2.length) {
        if (arr1[i] < arr2[j]) {
            i++
        } else if (arr1[i] > arr2[j]) {
            j++
        } else {
            return arr1[i]
        }
    }
}
console.log(finmix(a, b)) //2

五、有序二维数组寻找某元素坐标

const data = [
    [1, 2, 5, 9, 10],
    [12, 22, 35, 49, 51],
    [61, 62, 75, 79, 81]
]

function finIndex(arr, target) {
    let i = 0;
    let j = arr[i].length - 1
    while (i < arr.length && j >= 0) {
        if (target > arr[i][j]) { i++ } else if (target < arr[i][j]) {
            j--;
        } else { return [i, j] }
    }
    return false

}
console.log(finIndex(data, 81)) //[2,4]

六、 数组的创建

//字面量
let a=[1,2,3]

//构造函数
let arr=new Array(1,2,3)
let arr1=new Array(3)

七、Array 对象属性

//constructor    返回对创建此对象的数组函数的引用。
//length    设置或返回数组中元素的数目。(比较常用)
//prototype    使您有能力向对象添加属性和方法。


let arr = [1, 3]
let arr1 = new Array(1, 2, 3)
console.log(arr.constructor) //[Function: Array]
console.log(arr1.constructor) //[Function: Array]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值