iT邦幫忙

1

Ruby基本介紹(一) && Reverse-integer解法

前言:正確的坐姿很重要

坐姿正確,才能避免腰部受傷,想投身久坐的職業,請愛護身體。


內建型態與變數(variable)

內建型態或者稱內建類別,也就是程式語言中已經標準化的資料型態,例如數字、字串、陣列、雜湊及符號等,很多語言的內建型態都很類似,也都有可能相同的內建方法,來對這些資料型態,或是資料封裝後變成的實體來進行查詢或操作等。

變數在這裡我會先用數學內的解釋方式,是一個用來表示"值"的"記號","Ruby中用變數來將前面提到的那些資料,來實體化"。在Ruby中,變數是非大寫開頭的英文字母組合,可加數字但第一個字要英文,不可加符號。
: 就是指那些資料。
記號 : 因符號類別,我自己故意稱記號。

很多人都說,Ruby是有很多方便語法的語言,是不是最多我不知道,但的確不少,可是要熟悉使用一些語法(黑魔法),必須先了解你的資料型態屬於哪一種類別,因為不同的類別是有不同的方法的,當然也有方法不同的類別也會有。
因此學習怎麼查詢操作這些類別前,請先學會一個method,就是class。如下圖。

https://ithelp.ithome.com.tw/upload/images/20210805/20135887hBOl2QmwiC.png

電腦非常的清楚回答,輸入的資料為哪一種類別(有發現都是大寫英文嗎?),知道正確的類別有哪些方法,才能快速的上手,不然跟我一樣常常看到類似

NoMethodError (undefined method ??? for "???":String)

的台詞,是會信心大打折的。

接著知道我們要操作的資料是哪種類別後,便可以到https://ruby-doc.org ,查詢我們所需要的語法。
這邊先以我想分享解題的Reverse-integer中會用到的一些常用方法來舉例。


TO系列

語法中如果出現長得像

to_?

,大概就知道是需要轉換型態,常用到的有to_i, to_s, to_a及to_h等。
非常的口語化,to Integer或to String,就是變成上面說到的那些類別,下圖簡單示範

https://ithelp.ithome.com.tw/upload/images/20210805/201358874ae1J5oe1o.png

可以發現數字可以轉換成字串,但不可以直接to_a轉成陣列。

https://ithelp.ithome.com.tw/upload/images/20210805/20135887vH7FbtqNZE.png

陣列可以轉換成字串,但不可以成數字,而要了解Ruby中轉型的規定除了多練習外,就是查看https://ruby-doc.org 各個列別中有哪些方法可以用,來快速上手。

加映:加減號
https://ithelp.ithome.com.tw/upload/images/20210805/20135887Mr8t5NdSRv.png

再舉例一個方法reverse,字串可用,數字不可直接用。
https://ithelp.ithome.com.tw/upload/images/20210805/20135887qCCHwLLqkb.png

這種在程式語言中,某類別能用,某類別不行的語法是非常多的,只有多練習了。


衍生題

  • 變數與常數的差別?
  • 符號與字串的差別?
    由於網路上非常多答案,我會在下篇文章分享"菜鳥式回答"。

Reverse-integer解法

leetcode上的Easy題型第二題,為什麼我不從第一題解勒?
因為:第一題我就不會了呀,轉職工程師夢想從刷leetcode開始,在第一題結束!
單純因為第二題剛好符合今天介紹的內容。

# 題目:Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-2**31, 2**31 - 1], then return 0.

# Assume the environment does not allow you to store 64-bit integers (signed or unsigned).

# Example 1:
# Input: x = 123
# Output: 321

# Example 2:
# Input: x = -123
# Output: -321

# Example 3:
# Input: x = 120
# Output: 21

# Example 4:
# Input: x = 0
# Output: 0

# Constraints:
# -2 ** 31 <= x <= 2 ** 31 - 1

題目很簡單,看不懂那串長長的英文,看例子也可以看出,題目希望我們將數字反轉,但是正負數,或尾數是零,0,以及結果必須是32bit(就是-2 ** 31 <= x <= 2 ** 31 - 1這範圍之內),初學者,不可能一看到題目馬上會解,但是這些例子其實常常是答案,告訴你要將題目變成什麼答案,所以可以考慮跟菜鳥我一樣從例子下手,滿足例子,答案常常就已經跑出來了。
https://ithelp.ithome.com.tw/upload/images/20210805/20135887qe7Vih7udT.png
求出 x.to_s.reverse.to_i 是我們所需一段程式碼。

https://ithelp.ithome.com.tw/upload/images/20210805/20135887A11bKETWo3.png
求出 -(x.to_s.reverse.to_i) ,負號的使用,以及()可以省略。

https://ithelp.ithome.com.tw/upload/images/20210805/201358874AG7HshYdA.png
這邊也是一個特點,數字字串如果前面有0,轉換後會自動去除,所以 x.to_s.reverse.to_i 即可滿足
至於零轉換還是零,所以也可用同一條程式碼解決,或是去考慮0是否就不必檢查,那又是另外一個問題

最後,將「-2 ** 31 <= x <= 2 ** 31 - 1」轉換成程式碼,

x < -2 ** 31 - 1 || x > 2 ** 31 + 1

將這些程式碼加入判斷(if)後即可求出解答,由於我還沒介紹到那邊,所以直接先貼自己的解法,如果真的是新手有緣人看不懂,我會之後說明,另外我的解法絕對不是最好解法,每個人每個時期,解題都可能會有不同的解法的,我相信高手們也都是會這樣認為,只是菜鳥我解法可能很醜是絕對的。

def reverse(x)
  if x >= 0 
    res = x.to_s.reverse.to_i
  else
    res = -x.to_s.reverse.to_i
  end
  
  if res < -2 ** 31 - 1 || res > 2 ** 31 + 1
    0
  else
    res
  end
end

三元運算式簡化先跳過,後提。

題外話

其實我也是個英文苦手者,到現在常常打true還常常打成ture,但請一起克服這點,英文也就是多看多讀多用就會的東西(說得很心虛)。
有人會問為何要解題,我會先回答,因為可以快速練習到程式語言中特殊有的語法、慣例及特性。
在初學階段解題時,常常搞不懂,解題有用處嗎?
會有這個疑問其實就是看不懂題目及沒有真正實做過專案,程式語言是拿來與電腦溝通後下達指令及查詢所需資料的,解題就是為了能查到存放在記憶體中的資料所做的練習(只是其一)。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言