“Hello, World!”だったら2を返し、”Hello, Worldwwww”だったら4を返す。
今回は最も長く連続して現れる文字を数えるプログラムを組んでみます。
問題(Long Repeat)
与えられた文字列から、最も長く連続して現れる文字を数える。
入力:String
出力:Int
例:
long_repeat('sdsffffse') == 4 long_repeat('ddvvrwwwrggg') == 3 long_repeat('') == 0
僕のコード
def long_repeat(line): max = 0 cnt = 1 for i in range(len(line)-1): if cnt > 1: cnt -= 1 continue for j in range(i+1,len(line)): if line[i] == line[j]: cnt += 1 else: break if max < cnt: max = cnt return max
工夫した点
仮に‘sdsffffse’を入力した場合、4文字目を基準に’f’を数え終わったら8文字目まで飛ばせるようにしました。
連続する文字の途中から数えても意味がないためです。
しかし、2重ループにcontinueとbreakなど、少しごちゃごちゃしたコードになってしまいました。
問題点
- 空の値を入力された際の処理を考えていない
“”を入力された際の処理を忘れていました。
Pythonはインデクシングに負の値も使えるのでプログラムは動きます。
しかし、if line != “” などで条件を付けておいたほうが良さそうです。 - 単純に読みづらい
わざわざiを固定して書かなくても、iを1から始めてline[i] == line[i-1]で比較してずらしていけば2重ループは要りません。
他の人の回答を見てから気づきました。
改善したコード
def long_repeat(line): cnt = 1 max = 1 if line != "": for i in range(1,len(line)): if line[i] == line[i-1]: cnt+=1 if cnt > max: max = cnt else: cnt = 1 return max else: return 0
最初のコードと比較すると、iの位置を調節する処理がなくなりました。
また、空の値を入力された際に直接0を返しています。
あとがき
自分のコードを見返すと、無意識に2重ループを使っていることがわかりました。
可読性が下がってしまっています。
無駄があるけどとりあえず動くコードではなく、読みやすく無駄の無いコードを書けるよう成長したいです。