Open16

LeetCode頑張ってみる

ピン留めされたアイテム
おーたにおーたに

世界一流エンジニアの思考法

で、基礎を固めた方が後々成長につながると、あったのでとりあえず毎日1問ずつ解いてみることにした
続けていく上で、思ったことなどを雑に残していく

気軽にコメントなどしてもらっても全然オーケーです

おーたにおーたに

毎日継続じゃないけど11日目

1~10日はほぼ答え見ないとわかんなかった

11日目にして答え見ずに正解できたぁ。。

問題の難易度も高いけど、そもそも問題自体自体わかりづらい気がする。。
(いくつかそういった内容のコメントもあるし)

おーたにおーたに

タイムリミットなんてあるのか!?
と思ったけど、どうやら処理のタイムリミットっぽい。
重すぎる処理だとなるようだね

おーたにおーたに

https://leetcode.com/problems/can-place-flowers/description/
花壇問題、ちょっとむずかったけど、答え見ずに解けた

# @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 今日の問題
https://leetcode.com/problems/reverse-vowels-of-a-string/description/?envType=study-plan-v2&envId=leetcode-75

20分くらい考えて、わからなかったので他の人の答えみた

def reverse_vowels(s)
  vowels = s.scan(/[aeiou]/i)  # 母音を抽出して配列に格納
  s.gsub(/[aeiou]/i) { vowels.pop }  # 母音を逆順に置き換え
end

gsubでマッチしたごとにブロックを呼び出し、popで反転させてるらしい
こんなん思いつかんわ
/i で大・小区別しないのは単純に勉強なった

おーたにおーたに

最近のちょっとした気づき

2週間くらい続けてるので、普段の業務で、もうちょっと簡単なコードはないかとか、いつも以上に意識するようになってきた。
のと、複雑なロジックを考えるときにコーディング練習してるし、案外簡単にできるんじゃね。という謎の自信を持てるようになってきた。

https://zenn.dev/link/comments/53803def5beaa5 書籍に書いていた「複雑な仕組みをなんとなく扱えてる感覚をもつ」。はこういう感覚に近いことを言っているのかもしれない。と思った

おーたにおーたに

めんどくさくて答えコピペしちゃってる時あるけど、続けてる

おーたにおーたに

今日の問題
https://leetcode.com/problems/unique-number-of-occurrences/description/?envType=study-plan-v2&envId=leetcode-75

この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 というので同じことできるらしい