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

217 阅读3分钟

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

46. x 的平方根 (sqrtx)

标签

  • 数学
  • 简单

题目

leetcode 传送门

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

实现 int sqrt(int x) 函数。

计算并返回 x 的平方根,其中 x 是非负整数。

由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

输入: 8
输出: 2
说明: 8 的平方根是 2.82842..., 
     由于返回类型是整数,小数部分将被舍去。

相关知识

二分法处理,二分查找是核心思想,可查看这篇 二分查找

首先我们确认题目是查找根,而且是有单调性的,二分法可用。

基本步骤

  1. 特判
  2. 声明左右边界指针,和制造一个中点
  3. 看情况
    1. 如果 mid 的平方正好等于 x,则返回 mid
    2. 如果 mid 的平方小于 x,说明平方根落在 mid 和 right 之间,left = mid + 1
    3. 如果 mid 的平方大于 x,说明平方根落在 left 和 mid 之间,right = mid - 1

写法实现

/**
 * @param {number} x
 * @return {number}
 */
var mySqrt = function(x) {
  // 特判
  if (x === 0) {
    return 0
  }
  // 二分法,先声明左右边界
  let [left, right, res] = [1, x, 0]
  while (left <= right) {
    let mid = left + Math.floor((right - left) / 2)
    if ( x === mid * mid) {
      return mid
    } else if (mid * mid < x) {
      left = mid + 1
      res = mid
    } else {
      right = mid - 1
    }
  }
  return res
};

console.log(mySqrt(10))

另外这个问题还能用些数学方式解决,有兴趣可以了解:牛顿迭代

这里不赘述直接上代码:

var mySqrt = function(x) {
  let res = x
  while(res * res > x) {
    res = Math.floor((res + Math.floor((x / res))) / 2)
  }
  return res
};

47. 爬楼梯 (climbing-stairs)

标签

  • 动态规划
  • 数学
  • 简单

题目

leetcode 传送门

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

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

相关知识

经典的爬楼梯问题(简单的 DP)

一个楼梯可以由 n-1n-2 的楼梯爬上来。

完全不了解动态规划请移步 动态规划

基本步骤

我们再次重复步骤加深印象

  1. 寻找最优子结构(状态表示)
  2. 归纳状态转移方程(状态计算)
  3. 边界初始化
  • 状态表示: dp[i] 表示 爬到i台阶的方案数

  • 状态转移方程: 因为一次只能爬 1 级或 2级,所以状态只可能从 dp[i - 1] 和 dp[i - 2] 这两个状态总和,于是方程就是 dp[i] = dp[i - 1] + dp[i - 2]

  • 边界条件: 我们是从第 0 级开始爬的,所以从第 0 级爬到第 0 级我们可以看作只有一种方案,即 f(0) = 1;从第 0 级到第 1 级也只有一种方案,即爬一级,f(1) = 1。依次往下推导就行,我们惊奇地发现,这不是斐波那契数列吗。

写法实现

var climbStairs = function(n) {
  let dp = []
  dp[0] = 1, dp[1] = 1
  for (let i = 2; i <= n; i++) {
    dp[i] = dp[i - 1] + dp[i - 2]
  }
  return dp[n]
};
console.log(climbStairs(3))

另外向大家着重推荐下这位大哥的文章,非常深入浅出,对前端进阶的同学非常有作用,墙裂推荐!!!核心概念和算法拆解系列

今天就到这儿,想跟我一起刷题的小伙伴可以加我微信哦 搜索我的微信号infinity_9368,可以聊天说地 加我暗号 "天王盖地虎" 下一句的英文,验证消息请发给我 presious tower shock the rever monster,我看到就通过,暗号对不上不加哈,加了之后我会尽我所能帮你,但是注意提问方式,建议先看这篇文章:提问的智慧

参考