前端算法必刷题系列[82]

321 阅读3分钟

这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战

这个系列没啥花头,就是纯 leetcode 题目拆解分析,不求用骚气的一行或者小众取巧解法,而是用清晰的代码和足够简单的思路帮你理清题意。让你在面试中再也不怕算法笔试。

前面连续的难题,来几个简单点放松下

151. 复写零(duplicate-zeros)

标签

  • 简单

题目

leetcode 传送门

给你一个长度固定的整数数组 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)

标签

  • 简单

题目

leetcode 传送门

给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数

如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。

示例 1

输入:arr = [1,2]
输出:false

示例 2

输入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。

基本思路

思路也十分清晰,就是下面两步

  1. 统计每个数字出现的次数
  2. 判断这些个次数是否是独一无二的
  • 具体的话可以用 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,我看到就通过,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧

参考