LeetCode頑張ってみる
で、基礎を固めた方が後々成長につながると、あったのでとりあえず毎日1問ずつ解いてみることにした
続けていく上で、思ったことなどを雑に残していく
気軽にコメントなどしてもらっても全然オーケーです
毎日継続じゃないけど11日目
1~10日はほぼ答え見ないとわかんなかった
11日目にして答え見ずに正解できたぁ。。
問題の難易度も高いけど、そもそも問題自体自体わかりづらい気がする。。
(いくつかそういった内容のコメントもあるし)
タイムリミットなんてあるのか!?
と思ったけど、どうやら処理のタイムリミットっぽい。
重すぎる処理だとなるようだね
花壇問題、ちょっとむずかったけど、答え見ずに解けた
# @param {Integer[]} flowerbed
# @param {Integer} n
# @return {Boolean}
def can_place_flowers(flowerbed, n)
# 追加で植えないならtrue
return true if n.zero?
add_flowerbed = flowerbed
# 植えられた数を管理する
add_flowers = n
flowerbed.each_with_index do |f,i|
#先頭に植えれるケース
if i.zero? && f.zero? && flowerbed[i+1] == 0
add_flowerbed[i] += 1
add_flowers -=1
next
end
next if f ==1
next if add_flowerbed[i-1] == 1 || flowerbed[i+1] == 1
# 既に全て植えれたら終了
break if add_flowers.zero?
# 植えた後の花壇と植えれた数を更新
add_flowerbed[i] += 1
add_flowers -=1
end
# 全て植えられたら0となる
add_flowers.zero?
end
花壇と植えた数は別に別途管理する必要はないから、これでいい
# @param {Integer[]} flowerbed
# @param {Integer} n
# @return {Boolean}
def can_place_flowers(flowerbed, n)
# 追加で植えないならtrue
return true if n.zero?
flowerbed.each_with_index do |f,i|
# 既に全て植えれたら終了
break if n.zero?
#先頭に植えれるケース
if i.zero? && f.zero? && flowerbed[i+1] == 0
flowerbed[i] += 1
n -=1
next
end
next if f ==1
next if flowerbed[i-1] == 1 || flowerbed[i+1] == 1
# 植えた後の花壇、追記で植える数を更新
flowerbed[i] += 1
n -=1
end
# 全て植えられたら0となる
n.zero?
end
[気づき]
ここに処理の使用メモリが表示されるっぽいんだけど、コード変更せず何回か実行してみると、毎回同じではないっぽいから、あくまで参考程度のものかな
7/22 今日の問題
20分くらい考えて、わからなかったので他の人の答えみた
def reverse_vowels(s)
vowels = s.scan(/[aeiou]/i) # 母音を抽出して配列に格納
s.gsub(/[aeiou]/i) { vowels.pop } # 母音を逆順に置き換え
end
gsubでマッチしたごとにブロックを呼び出し、popで反転させてるらしい
こんなん思いつかんわ
/i で大・小区別しないのは単純に勉強なった
今日の問題
難易度medium だったけど、easyより調査簡単だったんだけど
難易度あまり当てにならないっぽいな
最近のちょっとした気づき
2週間くらい続けてるので、普段の業務で、もうちょっと簡単なコードはないかとか、いつも以上に意識するようになってきた。
のと、複雑なロジックを考えるときにコーディング練習してるし、案外簡単にできるんじゃね。という謎の自信を持てるようになってきた。
https://zenn.dev/link/comments/53803def5beaa5 書籍に書いていた「複雑な仕組みをなんとなく扱えてる感覚をもつ」。はこういう感覚に近いことを言っているのかもしれない。と思った
7/24
全然わからんかった
夜のせいか全く頭が回らん
問題の正解を正しく導くのが難しいなぁ
データ構造やアルゴリズムとか勉強した方がいいかな
1回目の解
def move_zeroes(nums)
zero_count = nums.select{|n| n == 0}.count
nums.delete(0)
zero_count.times { nums.push(0)}
nums
end
selectしないからこっちの方が効率的かも
def move_zeroes(nums)
nums_count = nums.length
nums.delete(0)
(nums_count - nums.length).times { nums.push(0)}
nums
end
めんどくさくて答えコピペしちゃってる時あるけど、続けてる
今日の問題
このhashでカウントする方法結構便利なんだよな
# @param {Integer[]} arr
# @return {Boolean}
def unique_occurrences(arr)
hash = Hash.new(0)
arr.each {|n| hash[n] +=1 }
hash.values.size == hash.values.uniq.size
end
array = ['apple', 'banana', 'apple', 'orange', 'banana', 'banana']
p array.tally
# {"apple"=>2, "banana"=>3, "orange"=>1}
tally というので同じことできるらしい