- 编写两个以上方法实现数组的去重,这是笔试中最常见的面试题了,我自己在面试过程中多次遇到,背也要给我背下来!!
① 利用添加 对象属性 方法去重,注意一定要用obj[item],而不是obj.item
const arr = [1,2,4,2,1,2,3,5]
function unique(ary){
let result = [],obj={}
ary.forEach(item=>{
if(!obj[item]){
result.push(item)
obj[item] = item
}
})
return result
}
unique(arr) //[1, 2, 4, 3, 5]
② 利用 indexOf 去重,遍历原数组,判断新数组是否存在当前元素,如果没有则push进新数组
const arr = [1,2,4,2,1,2,3,5]
function unique(ary){
let result = []
ary.forEach(item=>{
if(result.indexOf(item) === -1){
result.push(item)
}
})
return result
}
unique(arr) //[1, 2, 4, 3, 5]
③ 利用 filter 过滤函数结合 indexOf 只返回第一个找到的元素的索引,返回数组中唯一的值
const arr = [1,2,4,2,1,2,3,5]
function unique(arr){
return arr.filter((item,index)=>{
return index === arr.indexOf(item)
})
}
unique(arr) //[1, 2, 4, 3, 5]
④ 利用ES6 的 Set 去重,这种去重的方法代码最少,但是有兼容性问题
const arr = [1,2,4,2,1,2,3,5]
function unique(ary){
return Array.from(new Set(ary))
}
unique(arr) //[1, 2, 4, 3, 5]
这里就介绍这几个啦,还有很多比较复杂的其他方法,这里就不多介绍了,一方面当然是代码越少越好了,我其实不建议写那些太绕的代码,不好理解还容易出bug,面试的时候也容易忘记,不如挑一些好记的记下啦!
- 判断一个字符串[“abcdddddef”]中出现次数最多的字符,统计这个次数?,这个也是出现频率特别高的笔试题,一定要牢记!
①利用for循环添加对象属性的方法,记录每个字符出现的次数,再利用ES6的Object.keys和Object.values得到出现最多的次数和对应的字符
const str = 'abcddddefabc'
const countMap = {}
for(let i=0,len=str.length;i<len;i++){
const item = str[i]
if(countMap[item]){
countMap[item]++
}else{
countMap[item] = 1
}
}
const max = Math.max(...Object.values(countMap))
const maxStr = Object.keys(countMap).find(key=>countMap[key]===max)
console.log(`${maxStr}:${max}`)
② 假定法,就是假定当前第一个字符为出现次数最多的字符char,再遍历循环每一个字符,每次把更多次数的字符替换到假定的变量char,最后得到最高次数的字符count
function countstr(str){
let arr = str.split('').sort()
let currentCount=0,count=0,currentchar='',char='';
for(let i=0,len=arr.length;i<len;i++){
if(arr[i] === currentchar){
currentCount += 1
}else{
if(currentCount > count){
count = currentCount
char = arr[i-1]
}else{
currentchar = arr[i]
currentCount= 1
}
}
}
console.log(`${char}:${count}`)
}
countstr('abcddddefabc') //d:4