这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战
这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。
前面连续的难题,来几个简单点放松下
151. 复写零(duplicate-zeros)
标签
- 简单
题目
给你一个长度固定的整数数组 arr,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。
要求:请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。
示例 1
输入:[1,0,2,3,0,4,5,0]
输出:null
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]
示例 2
输入:[1,2,3]
输出:null
解释:调用函数后,输入的数组将被修改为:[1,2,3]
基本思路
这题其实就是考代码基本写法,随便写写就行,api 的 splice()
用法 和 pop()
这种原地修改的方式了解就比较方便,不用做偏移。
写法实现
练下 ts 写法,注意 ts 不会影响运行时的 js 行为,也是弱类型的语言。
function duplicateZeros(arr: number[]): void {
for (let i = arr.length; i >= 0; i--) {
if (arr[i] === 0) {
// 在 idx 处添加一个 0
arr.splice(i, 0, 0)
arr.pop()
}
}
};
152. 独一无二的出现次数(unique-number-of-occurrences)
标签
- 简单
题目
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数
都是独一无二
的,就返回 true;否则返回 false。
示例 1
输入:arr = [1,2]
输出:false
示例 2
输入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。
基本思路
思路也十分清晰,就是下面两步
- 统计每个数字出现的次数
- 判断这些个次数是否是独一无二的
- 具体的话可以用
Map
统计,遍历数组把数字作为键
,次数作为值
,得到 map 映射 - 把 map 的 values 作为次数数组转成
数组
。 - 可以用
Set
去重,比较去重前后的数组长度即可
写法实现
function uniqueOccurrences(arr: number[]): boolean {
let map = new Map()
// 遍历得到一个统计完每个元素次数的 map
for (let item of arr) {
if (map.has(item)) {
map.set(item, map.get(item) + 1)
} else {
map.set(item, 1)
}
}
return isUniqueArr(Array.from(map.values()))
};
function isUniqueArr(arr: number[]): boolean {
return arr.length === [...new Set(arr)].length
}
另外向大家着重推荐下这个系列的文章,非常深入浅出,对前端进阶的同学非常有作用,墙裂推荐!!!核心概念和算法拆解系列
今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦 点击此处交个朋友
Or 搜索我的微信号infinity_9368
,可以聊天说地
加我暗号 "天王盖地虎" 下一句的英文
,验证消息请发给我
presious tower shock the rever monster
,我看到就通过,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧