前端算法面试必刷题系列[12]

1,212 阅读2分钟

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

18. 删除排序数组中的重复项 (remove-duplicates-from-sorted-array)

标签

  • 双指针
  • 快慢指针
  • 简单

题目

leetcode 传送门

这里不贴题了,leetcode打开就行,题目大意:

给定一个有序数组 nums,对数组中的元素进行去重,使得原数组中的每个元素只有一个。最后返回去重以后数组的长度值。

基本思路

  1. 数组完成排序后,我们可以放置两个指针 i 和 j,其中 i 是慢指针,而 j 是快指针。只要 nums[i] === nums[j],我们就增加 j 跳过重复项
  2. 当我们遇到 nums[j] !== nums[i] 时,跳过重复项的运行已经结束,因此我们必须把nums[j]的值复制到 nums[i + 1]
  3. 然后递增 i,接着我们将再次重复相同的过程,直到 j 到达数组的末尾为止。

写法实现

/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function(nums) {
  // 特判
  if (nums.length === 0) {
    return 0
  }
  let i = 0
  for (j = 1; j < nums.length; j++) {
    if (nums[j] !== nums[i]) {
      i++
      nums[i] = nums[j]
    }
  }
  return i + 1
};

19. 移除元素 (remove-element)

标签

  • 双指针
  • 快慢指针
  • 简单

题目

leetcode 传送门

这里不贴题了,leetcode打开就行,题目大意:

给定一个数组 nums 和一个数值 val,将数组中所有等于 val 的元素删除,并返回剩余的元素个数。根上一题基本相同思路就行。

基本思路

  1. 还是用两个指针 ij,其中 i慢指针j快指针
  2. 上一题是跳重复元素,这题更简单,比较是否等于 val 就行了。当 nums[j] === val时,递增 j 跳过该元素
  3. 只要 nums[j] !== val 我们就复制 nums[j]nums[i]同时递增两个索引
  4. 重复这一过程,直到 j 到达数组的末尾,该数组的新长度为 i。

写法实现

/**
 * @param {number[]} nums
 * @param {number} val
 * @return {number}
 */
var removeElement = function(nums, val) {
  let i = 0
  for (j = 0; j < nums.length; j++) {
    if (nums[j] !== val) {
      nums[i] = nums[j]
      i++
    }
  }
  return i
};

20. 两数相除 (divide-two-integers)

标签

  • 数学
  • 中等

题目

leetcode 传送门

这里不贴题了,leetcode打开就行,题目大意:

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。

基本思路

相关资料,使用快速幂思想,这个讲起来相对复杂,这只是梳理,就不多说了。有兴趣自己看文档。

写法实现

var divide = function(dividend, divisor) {
  // 符号
  let sign = true
  if (dividend < 0) {
    dividend = 0 - dividend
    sign = !sign
  }
  if (divisor < 0) {
    divisor = 0 - divisor
    sign = !sign
  }
  if (divisor > dividend) {
    return 0
  }
  let [res, mul_divisor] = [1, divisor]
  while (dividend > mul_divisor + mul_divisor) {
    res += res
    mul_divisor += mul_divisor
  }
  res = res + divide(dividend - mul_divisor, divisor)
  if (!sign) {
    res = 0 - res
  }
  res = res >= 2147483648 ? 2147483647 : res
  res = res <= -2147483648 ? -2147483648 : res
  return res
};

今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦 搜索我的微信号infinity_9368,可以聊天说地 加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我 presious tower shock the rever monster,我看到就通过,暗号对不上不加哈

参考