こんにちは
今回の学びは
・bashの正規表現でスペースは[[:space:]]
・bashでファイルをwhileで読んで~=で正規表現くらいは出来てね
マラソンのやりかた
マラソンでは一時間で難問とけるかのトライアルです。今までの練習の実践編です。
できるだけ解ければ良しなのですが、1問解く時間の目安は20分としてみます。
マラソン中は振り返らず、終了後にいつものように「次のこの問題を解くばあい知っていればよい一つの事実とは?」
とう問題の核となるものを抽出していきます。
問題の選び方は、今はleetcodeのpick nextで良さげなもを選ぶ、というほぼノールールでいきます。
それでは始めます。(適当な問題へのリンクはこちら、ここからPick Oneでスタート!)
8:03 start
1問目 => medium 71. Simplify Path
満足のでき。
実装前の考察というか、言葉数、これでいける!といって実装を始めたのではなく、やりながら、見つけたのでそこは反省点。
class Solution: def simplifyPath(self, path: str) -> str: canonical = [] for element in path.split('/'): if element == '' or element == '.': pass elif element == "..": if len(canonical) > 0: canonical.pop() else: canonical.append(element) return "/" + "/".join(canonical)
次!
easy 189. Rotate Array
easyなのに、私には難しく感じて最初の案にたどり着くまで
15分考えた。そして出てきたのはtmps = []に後ろからk分、保存しておく
というもの。
他にspace O(1)とか思いつかないので、これで実装はじめていいですか?始めます。
一応、クリアできましたね。工夫は入力がk > szになり得るのでその時は、どう扱えばよういかという対応ですね。これがないと通らないですがw 必須な工夫です
class Solution: def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ tmps = [] sz = len(nums) if k > sz: k = k % sz #print("k:%s, %s %s %s" % (k, sz-1, sz-1-k, -1)) for i in range(sz-1, sz-1-k, -1): tmps.append(nums[i]) for i in range(sz - k -1, -1, -1): #print("%s <- %s" % (i+k, i)) nums[i+k] = nums[i] i = 0 while len(tmps) > 0: x = tmps.pop() nums[i] = x i += 1
なんとかできたものの
解答を見ておさらいする必要がありそうな問題です。
Python solution faster than 93%, O(1) space 三箇所にわけてレバース!!
理解できてないですので、暇な時にもどってきます。
次の問題としては、rotate listなんかもいいでしょう。
次!easy valid-phone-numbers
まず!bashとかいきなり聞かれた面食らうのでとりあえず
ググりながら取り組む。
while read line do if [[ $line =~ "^\([0-9]{3}\) [0-9]{3} [0-9]{4}$" ]]; then echo $line elif [[ $line =~ "[0-9]{3} [0-9]{3} [0-9]{4}" ]]; then echo $line else echo "else -> $line" fi done < file.txt
あれ!?最後の行がでない!それは最後の行が改行されてないからで
そんなトリッキーな入力が渡される可能性がある場合は
こう!`while read line`が空行じゃなければループ続行
while read line || [ -n "${line}" ]; do echo $line done < file.txt
・bashでファイルをwhileで読んで~=で正規表現くらいは出来てね
スペースのマッチのしかたがわからない!!以下、意図通り動きません!
while read line || [ -n "${line}" ] do if [[ $line =~ "^\([0-9]{3}\) [0-9]{3} [0-9]{4}$" ]]; then echo $line elif [[ $line =~ "[0-9]{3} [0-9]{3} [0-9]{4}" ]]; then echo $line elif [[ $line =~ '[0-9]{3} [0-9]{4}' ]]; then echo "dummy -> $line" else echo "else -> $line" fi done < file.txt
仰々しいですが
スペースは`[[:space:]]` と表記するようです (how-can-i-match-spaces-with-a-regexp-in-bash)
elif [[ $line =~ [0-9]{3}[[:space:]][0-9]{4} ]]; then
・bashの正規表現でスペースは[[:space:]]
(時間配分は5分問題理解 10分検討 10分実装の一文20分構成)
まずは入出力をしっかりおさえましょう。
「次のこの問題を解くばあい知っていればよい一つの事実とは?」
この問題を解いてやって前回の問題153 find-minimum-in-rotated-sorted-array の意図がわかった。
バイナリーサーチの検索はO(logN)だよ、O(N)よりはえーぞ、と。
1問目 => medium 71. Simplify Path => linuxのパスでcanonicalっていうのがあります。
次!easy valid-phone-numbers => while read lineを覚えておきましょう
easy 189. Rotate Array => 一個づらすのをどうやって解くかかんがえてみましょうか?
まとめ
・bashの正規表現でスペースは[[:space:]]
・bashでファイルをwhileで読んで~=で正規表現くらいは出来てね
以上です