大航道計畫筆記 - Ruby Leetcode

麻瓜建議

建議先去codecademy暖身,建立ruby語感和型別(type)和以下觀念

if , ifels ,else判斷式

Loops 迴圈

要注意的是迴圈跑的最後一次, 跟其他語言有點不一樣

#----for----
for(0...5) do |i|
    print(i)
    # 輸出  01234
end

#----each----

(0...5).each do|i|
    print(i)
    #輸出 01234
end


#----while----

i=0
while i<=5
    print(i)
    #輸出012345
end

Array 和 Hash

Method

說明:類似像c java的function

Block


Leetcode 解題

Power of Two

leetcode : https://leetcode.com/problems/power-of-two/

可使用觀念

  • mod 取餘數% : 如10%2==0 , 11%2==1
  • loops 迴圈
  • 判斷式 if elsif
  • (選用)recursion 遞迴:c語言的遞迴參考

解題想法

def is_power_of_two(n)
	# 如果是 power of 2  
    # n可被2 整除( n%2 ==0 )
    # 不停的整除最後如果商為1,則回傳 true
end

參考答案

Contains Duplicate

leetcode : https://leetcode.com/problems/contains-duplicate/

可使用觀念

  • array / hash
  • sorting: ruby array 有內建method使用
  • loops 迴圈
  • array的大小:nums.length

解題想法

# @param {Integer[]} nums
# @return {Boolean}
def contains_duplicate(nums)
	#做法1: 排序後 依序判斷第i和i+1個是否相同
    #做法2: 使用hash來儲存該數字有沒有出現過
end

參考答案

Ugly Number

leetcode : https://leetcode.com/problems/ugly-number/

可使用觀念

  • loops 迴圈 : [2,3,5].each{|i| } 可以跑裡面三個數字

解題想法

# @param {Integer} num
# @return {Boolean}
def is_ugly(num)
	#重複除 2, 3, 5 最後如果整除且商為1 就是ugly number
end

參考答案

Move Zeroes

leetcode : https://leetcode.com/problems/move-zeroes/description/

可使用觀念

  • loops 迴圈
  • array
  • array的method: nums.delete_at(i) 刪除第幾個
  • array的method: nums.concat(anotherArray) 把其他的array補到最後
  • array的method: [0]*5 會變成[0,0,0,0,0]
  • array的method: nums<<0 把 0補到nums array的尾巴

解題想法

# @param {Integer[]} nums
# @return {Void} Do not return anything, modify nums in-place instead.
def move_zeroes(nums)
	#作法1: 把0刪光,再補到最後
    #作法2: 類似用bubble sort,但是效率較低

end

參考答案

Valid Anagram

leetcode : https://leetcode.com/problems/valid-anagram/description/

可使用觀念

  • array , string ,hash
  • loops
  • string:轉換成array的methods.each_char.to_a
  • hash : iamHash.all?{|index,value| 判斷式 } 可以快速判斷所有的hash值,最後回傳 boolean

解題想法

# @param {String} s
# @param {String} t
# @return {Boolean}
def is_anagram(s, t)
	# 1.先判斷是不是一樣長,然後兩字串先排序後在相比(要先轉換)
    # 2.開個HASH,把array的value當作key值來計算數量
    # s如果有這個字就 +1  t有就-1  
    # 最後hash裡面所有的value都是0就代表兩個string
end 

參考答案

Majority Element

leetcode : https://leetcode.com/problems/majority-element/description/

可使用觀念

  • loops
  • array

解題想法

def majority_element(nums)
	#1.用hash去計算nums每個value的數字
    #  再從hash挑出最大的那個key 回傳結果
    # (但是這個方式有點多餘 因為majority_element一定是 大於n/2個)
    #2.因為最多的那個數字一定多於一半的array, 先宣告一個 count 和max
    # 去跑迴圈,如果count是0 , max=nums[i]
    # 如果不是0 (這題的話一定不會小餘0), 如果max是nums[i], count就 +1
    # max不是nums[i], count就 -1
    # max最後就一定是Majority Element(因為count一定是>0)
end

參考答案

Remove Duplicates from Sorted Array

leetcode : https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/

可使用觀念

  • loops
  • array
  • array: nums.delete_at(i)
  • 因為會刪除元素
  • nums[i]=nil
  • nums.compact!
  • nums.uniq!

解題想法

# @param {Integer[]} nums
# @return {Integer}
def remove_duplicates(nums)
	#因為排序過了,所以就判斷第i和i+1個是不是一樣
    #是的話就把它刪掉
    #刪除方式: 可以用delete_at
    #hint: ruby有犯規的刪除重複值method可以用
end

參考答案

Single Number

leetcode : https://leetcode.com/problems/single-number/description/

可使用觀念

  • loops
  • array

解題想法

# @param {Integer[]} nums
# @return {Integer}
def single_number(nums)
	#先排序,用迴圈去找i和i+1是不是一樣
end

參考答案

Best Time to Buy and Sell Stock

leetcode : https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/

可使用觀念

  • loops
  • array

解題想法

# @param {Integer[]} prices
# @return {Integer}
def max_profit(prices)
   #要記錄最低價和最高利潤
   # 設定一個變數maxprof 紀錄目前利潤
   # 設定一個變數minprice 紀錄目前最低價
   # 用loop跑 prices 
   # => 如果 prices[i] > b 則算一下 prices[i] - b 有沒有比 a大
   # => 其他的狀況,將b = prices[i]
end

參考答案

Search Insert Position

leetcode : https://leetcode.com/problems/search-insert-position/description/

可使用觀念

  • loops
  • array

解題想法

# @param {Integer[]} nums
# @param {Integer} target
# @return {Integer}
def search_insert(nums, target)
	# 用迴圈跑,判斷target在哪一個nums[i], nums[i+1]中間
end

參考答案