Ruby解题分享--Sqrt(x),二分搜寻演算法。

老歌了~


宅男开YouTube来看,永远不缺手游广告...

最近有个广告台词,开局一定要选拳法,如果开局选心法,血多但是攻击力不够,开局如果选拳法,杀伤力高,拓荒才会快。

如果拳法代表各语言自己的特殊语法,心法代表各种逻辑或是数学公式,那还真的有拳法较实用的感觉,尤其对新手而言。

但高手最後常常还是比拼内力深厚,所以偶尔练练心法吧....
如果没跟李寻欢一样帅,只练飞刀也不会是主角的...

Sqrt(x)

题目连结:https://leetcode.com/problems/sqrtx/
题目:求平方根整数部分。

整理

def my_sqrt(x)
end

p my_sqrt(4) #=> 2
p my_sqrt(8) #=> 2

提示部分希望我们不要用函式库等特殊语法。

所以跟以下解法说掰掰

def my_sqrt(x)
  (x ** 0.5).floor
  # Math.sqrt(x).floor
end

另外迭代也不行,因为考虑到所花时间(资源),程序码出现迭代处理的都会无法运行。
所以下面解法也掰掰

def my_sqrt(x)
  (1..x).each do |num|
    return num if num * num == x
    return num - 1 if num * num > x
  end
end
#数字大一点就会发现答案出来明显慢了,虽然大家现在电脑都很快....

二分搜寻演算法

有请wiki帮忙解释....
好的,即使我很菜,我也自豪地认为有人跟我一样看不懂 XD
那我们看简单一点的二分法

我们就以,指的是将一个整体事物分割成两部分。也即是说,这两部分必须是互补事件,即所有事物必须属於双方中的一方,且互斥,即没有事物可以同时属於双方。这段来解这题。

先来看一个很古老的游戏,猜数字。
猜1~100其中一个数字,正确答案一定是 1 < n < 100, 1与100可以想像成边界。
1..100等於整个事件,比1大比100小就是那互补事件,不可能大於1又大於100。
假设 ans == 39, 我们猜num = 50,那50 > 39又 50 < 100,50就取代大的边界成为了 1 < n < 50。
我们再猜20, 20 < 39, 1 < 20,20取代小边界成为了 20 < n < 50。
到最後,n其实就是两个边界的中间值。38 < 39 < 40。

边界部分有人用上下或左右来称呼,就看个人吧。

def my_sqrt(x)
  #需要左边界
  #需要右边界
  #设定回圈起始条件
  #设定回圈做啥
  #设定回圈终止条件
end
def my_sqrt(x)
  start_num = 0 #左边
  end_num = x  #右边
  
  #设定回圈起始条件
  while start_num <= end_num  #<= 是因为考虑 x == 0
    ans = (end_num + start_num)/2 #求中间值
    if ans**2 <= x && x < (ans+1)**2  #以8举例 2*2 < 8 , (2+1)*(2+1) > 8
      return ans
    elsif x < ans**2  #这边就是找不到答案 改边界值
      end_num = ans - 1
    else
      start_num = ans + 1
    end
  end
end

不过求二分法中间值,程序编码中会有准确度更高的公式,l == 左, r == 右。

MID = l + (r - l)/2 

我们将公式代入,至於公式为何长这样,准确在哪,菜鸟的我就不献丑了。

def my_sqrt(x)
  start_num = 0 
  end_num = x  
  
  while start_num <= end_num  
    ans = start_num + (end_num - start_num)/2 
    if ans**2 <= x && x < (ans+1)**2  
      return ans
    elsif x < ans**2  
      end_num = ans - 1
    else
      start_num = ans + 1
    end
  end
end

我还是要开局选拳法....

另外此题牛顿迭代解法,略...


<<:  基础常用:python 从字串中取出数值

>>:  在 Fedora 34 上安装 VirtualBox 6.1.26

[Vue2Leaflet系列二] Leaflet Plugins with Vue

本篇文章请参考 [Vue2Leaflet系列一] 从vue-cli安装到建置地图 之前介绍过Leaf...

D36-铁人赛完赛心得

铁人赛完赛罗~~ 在完赛的这一刻,我发现,我获得的东西,比我写出来的东西还多。 - 除了看自己写出来...

实用的 each_cons 方法,Ruby 30 天刷题修行篇第十二话

嗨,我是A Fei,今天真的忙翻,以下是今天的题目: (题目来源: Codewars) The ma...

[Bonus 系列] - 和 useEffect 很像的 useLayoutEffect

这篇要补充一个比较少使用到的 useLayoutEffect hook,和 useEffect 语法...

Day2 - Yolo? 那是什麽? 能吃吗?

今天要介绍的是Object detection(物件侦测)以及CNN (Convolutional ...