iT邦幫忙

1

Ruby基本介紹(二) && Palindrome-number解法

保持好心情,寫code前,先聽首K-pop!

Yes


此篇文章會提到的事

  • 上篇文章衍生題回答。
  • 內建類別補充。
  • 變數補充。
  • 流程控制(Folw Controller)與迴圈(Loop)事前準備。
  • Palindrome-number解題分享。

還是要重申,這是菜鳥我目前的回答,學習跟查資料後一定會有更好的答案。

變數與常數的差別?

變數:在Ruby中,變數是非大寫開頭的英文字母組合,可加數字但第一個字要英文,不可加符號。
常數:在Ruby中,常數是開頭大寫英文字母組合,可加數字但第一個字要英文。類別及模組等都須以常數來命名,可與變數一樣直接宣告資料為實體,但在Ruby中與其他語言較明顯差異,常數可以更改資料(會有警告)。
菜鳥解答 : 類別及模組類別必須用常數命名,常數第一個英文字母必須用大寫英文,因為Ruby的特性,通常將不會去更動的資料用常數去命名。

符號與字串的差別?

初期常會看到的符號是指

:a , :name

並非指加減乘除那些符號。
菜鳥解答 :真想回答沒有差別,在初期學習過程中能明顯知道的差異為,因符號固定記憶體儲存位置所以不可更動,並且因記憶體位置固定,所以使用符號,處理速度較快。
補充:物件後加上.object_id可查詢物件參照位置(object reference)。
https://ithelp.ithome.com.tw/upload/images/20210806/20135887JKP5AtpLlS.png
有興趣者也可用陣列,數字其他資料來查詢。


內建類別補充

陣列(Array)

重申:內建類別很多程式語言都是相同有的,但是或多或少各程式語言都有特殊的"語法"來處理。
基本介紹,用[]來包住的資料通常都是陣列,例如

[1, 3, 5, 6, 8]
["我", "愛", "聽", "音樂"]

,當然也有許許多多特性以及黑魔法需要學習,例如

#夥伴可以試著自行在Interactive Ruby Shell環境中操作,就是irb那個。
[1, 2, 3] + [7, 8, 9]
[1, 2, 3, 4] - [2, 4, 5]
["我", "愛", "聽", "音樂"].join

陣列像個藥盒,每一格放著可能相同或不同的資料。(空格內可以是nil)
但陣列有個很基礎且大多語言相同的特性,陣列第一個資料我們在呼叫時,他所佔的位置不是1是0,最後一格資料所佔位置是陣列格數n-1,例如
https://ithelp.ithome.com.tw/upload/images/20210806/20135887wet3OyAfCG.png
這項特性,初期就常會遇到喔!

雜湊(Hash)

Ruby稱雜湊,也有語言稱"字典",與陣列最好辨別的差別是用{}包起,以及每個位置一定有"KEY",位置內當然也可以有nil,但是因為格子內可以放複數資料,所以通常不會用藥盒那樣想Hash,可以想成車站內那種置物箱吧。

{:a => 123, :b => 456, "c" => 789}
{:a => 123, :b => "來聽K-pop!", :c => nil}
{:a => [1, 3, 5], :b => {"as" => 2 , :ccc => "我不要"} , :c => 2021}

一樣有許多語法,讓我們可以操作

{:b => 1, :a => 2}.has_key?(:a)
{:b => 1, :a => 2}.delete(:a)

從陣列到雜湊開始,在Ruby及Rails運用上常常就不會是簡單的加減乘除。其實在網路資料傳輸上,電腦之間傳送的資料都是雜湊型態,例如line內的對話,一張早安圖,不會是一個"早安.jpg"就可以,從長輩傳到我們手上,加上及處理複雜的資料型態,就是程式語言的功能之一。

加碼補充:

  new_hash = Hash.new
  #可以用
  new_hash = {}
  #取代
  
  new_arr = Array.new
  new_arr = []
  也是一樣

變數補充

很多前輩可能會這樣說,在Ruby中,變數宣告不用像JS需要var, let來協助宣告,其實開始有接觸較複雜的編碼後,可能就不會這樣覺得了。是因為Ruby的生父在創造這語言時,加入了太多的"方便",所以在使用上我們常常直接宣告即可。
(js也是可以直接宣告環境變數呀,只要我敢.......但是同事可能會殺了我??)

前對提到,變數用小寫英文字母開頭為命名,例如

x = 123
# x 就是變數, 123就是資料, 變數指向一個資料後, 成為了一個實體, 這個實體開始有許多資料本身可以用的方法可以使用。

例如
https://ithelp.ithome.com.tw/upload/images/20210806/20135887r8gSV5twQ1.png

變數在Ruby的世界中,還有分一些特別的身份,這部分由分享文章來補充
是的,再次搬出為你自己學Ruby on Rails

建議一定要好好認識實體變數,在進入rails後會發現,實體變數就像你在rails世界中的情人,越了解,感情生活越順遂....


流程控制(Folw Controller)與迴圈(Loop)事前準備。

我用比喻的方式來說明,我今天得到一個資料,這個資料是一個數字,我就要將這個資料的數字+2後的結果算出來。這便是流程。

複雜一點的流程,我今天得到一個資料,我先要先判斷這資料是不是一個數字,不是的話告訴傳資料給我的人,是的話如上面一樣運算。

再複雜一點,是數字後,我還要判斷是不是大於100,我再計算。工程師要學習就是將這些複雜的需求變成編碼告訴電腦處理,並且學習將這些編碼簡單化且好閱讀。
將編碼的運算速度加快,那是以後的事。

所以定義一個方法,來將資料做處理,就是一整個小流程控制。
如下
https://ithelp.ithome.com.tw/upload/images/20210806/20135887PlUHYSsIWZ.png

而我們進入流程控制後,可能需要一直重複做某些事,直到我們設定的條件為止,讓電腦重複做一件事這個行為就叫迴圈。
如果沒有設定好條件,則可能會進入無限環圈。(可以想想要無限迴圈做啥?)

下篇文章我們用常用的判斷語法及迴圈語法來正式介紹。


Palindrome-number解題分享。

題目連結:https://leetcode.com/problems/palindrome-number/
題目解釋,判定數字反轉回數字後,是否還是相同?
例子: 121(true), -121(false), 10(false), -101(false)
整理後如下 (從這邊開始,我們也將可閱讀性加入解題吧。先從變數命名有意義開始)

def is_palindrome(num)
  #流程編寫區
end

puts is_palindrome(121)
puts is_palindrome(-121)
puts is_palindrome(10)
puts is_palindrome(-101)

上一題我們提到數字反轉要用

integer.to_s.reverse.to_i

其實多查詢就會發現一個語法是digits,這題我們就用digits來處理吧。

一樣解析一下問題後,將我們需要的流程及特性先用中文整理出來。

def is_palindrome(num)
  #負數都是false
  #所以大於等於0時才需要去需做反轉
  #反轉後判斷是否相同
end

接著先用最囉唆的寫法寫出來。

def is_palindrome(num)
  #負數都是false
  #所以大於等於0時才需要去需做反轉
  if num >= 0 
    resverse_num = num.digits.join.to_i
  else num < 0 #如果判斷點只有兩個,else後面可以不打出
    return false
  end
  #反轉後判斷是否相同
  if resverse_num == num.digits.join.to_i
    true
  else resverse_num != num.digits.join.to_i
    false
  end
end

接著我們利用一些特性來整理這段控制流程。如果if判斷條件像這種不是a就是b的狀況時,我們可以直接用一項判斷就可以完成編碼,else後面可以省略,並且==這符號等於判斷,如果是單純要true或是false可以省略。所以

def is_palindrome(num)
  if num >= 0
    resverse_num = num.digits.join.to_i
  else
    return false
  end
  resverse_num == num.digits.join.to_i
end

再來,觀察可以發現,我們做判斷時因為去除了負數,而正整數在反轉時,處於文字狀態時就可以判定,所以不需要多一個變數來處理。因此

def is_palindrome(num)
  if num >= 0
    num.to_s = num.digits.join
  else
    return false
  end
  num.to_s == num.digits.join
end

我們再整理答案一下,何時會出現true?
在正整數時,且正整數反轉比對後還相同時,所以其實整題只剩兩個判斷,而判斷式可以用&&來加在一起。
所以

def is_palindrome(num)
  if num >= 0 && num.to_s == num.digits.join
    true
  else
    false
  end
end

最後也演變成其實不是a就是b的判斷,所以

def is_palindrome(num)
  num >= 0 && num.to_s == num.digits.join
end

結束了這一題!


本篇衍生題

Ruby中,p與puts, &&與||, =與==分別有何不同?

Ruby是強型別還是弱型別?

什麼是K-pop!?


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

尚未有邦友留言

立即登入留言