前端笔试中最常见的两道题

  • 编写两个以上方法实现数组的去重,这是笔试中最常见的面试题了,我自己在面试过程中多次遇到,背也要给我背下来!!

① 利用添加 对象属性 方法去重,注意一定要用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.keysObject.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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值