独学でPython『文字列操作』の基本を学ぶ【プログラミング基礎練習問題1】
(Pythonの基本を初めからしっかり学びたい方はこちら↓↓)
プログラミングの基本文法を学んだ方からよくこのような質問を頂きます。
悩むペン銀
Pythonの基本構文を学んで、プログラミングに対する基礎知識もある程度勉強したんだけど、次に何をすればいいのか分からない。次に何をすればより成長できるか教えて欲しい
こう言った『次に何すればいいか分からない』と言う疑問に対し
僕からの回答を言うと、
『沢山問題を解きましょう』
です。
これこそプログラミング力を飛躍的に向上させる一番の近道です。
このシリーズを最後まで学習することで、これまで学んできた基礎知識を定着させ、
最終的に様々な問題を、Pythonを駆使して解決できるようになるはずです。
本シリーズを習得した後、
得ることができる主な知識・内容は以下3点です。
本記事の内容
この記事を書いている僕は国立大学にてCSの学位を保有しており
エンジニアとしての仕事では現実問題を解き続けています。
実際に問題を解いていくと今まで知らなかった便利な組み込み関数や
新しい思考プロセスを学ぶことができます。
それではやっていきましょう。
作業用音楽でもかけながら
勉強してみてください。
目次
(注) 問題のレベルについて
以下に示す問題のレベルは五段階に分割しています。
あくまでも目安なので、自分が解いてみたい・解ける問題から手をつけてみてください。
解けない問題は無理して解いて理解しようとせず、もう少し学びを深めてから取り組みましょう。意外と時間を置いて取り組むと、あっさり解けたりします。
プログラミングの勉強は継続が重要です。なので楽しさを優先しましょう!
【問題1】文字列操作 レベル: normal
文字列を暗号化せよ!
文字列操作においてrun-length encoding(文字列の長さをエンコーディングする事)は簡単で、よくあるエンコード方法として知られている。基本的なアイディアは連続する文字列の長さを数え、それぞれ整数値に置き換える事だ。問題はこれを実現するlengthEncoding
関数を実装してほしい。
具体例
lengthEncoding関数に引数を渡した際
出力結果は以下を想定しています。
注意事項
以下、実装における注意事項です。
テスト
以下のテストコードをエラー無く通過できれば正解です。
作成した関数を以下のように自分の環境に書き込んで完成させ
Runボタンを押して確認してみましょう。
# This will get executed each time the exercise gets initialized
def lengthEncoding(arg):
ここにコードを入力してください
return your_answer
data ='AAABBBCCCDDDEEOOO'
assert lengthEncoding(data) == 'A3B3C3D3E2O3'
data = 'ABDNABDBSSBDNBSNS'
assert lengthEncoding(data) == 'A1B1D1N1A1B1D1B1S2B1D1N1B1S1N1S1'
data ='IIIIIDDDDDPPPPWWW'
assert lengthEncoding(data) == 'I5D5P4W3'
print('Pass!!')
<-
) to create the variable a
.解答例
def lengthEncoding(word):
n = len(word)
if n == 0:
return ''
letter = word[0]
length = 1
res = ''
for i in range(1, n):
if word[i] == letter:
length += 1
else:
res += letter + str(length)
letter = word[i]
length = 1
res += letter + str(length)
return res
解説付き解答例
def lengthEncoding(word):
n = len(word) # wordの文字列長を取得
if n == 0:
return '' # wordの文字列長が0の場合
letter = word[0] # wordの先頭文字をletterに格納
length = 1
res = ''
for i in range(1, n):
if word[i] == letter: # word先頭文字と続く文字が一致した場合
length += 1 # lengthをインクリメント
else:
res += letter + str(length) # word先頭文字と続く文字が一致しなかった場合
letter = word[i] # resにその文字と文字列長を格納し、letterを先頭文字から一致しなかった文字に
length = 1 # アップデートし、lengthを1に戻す
res += letter + str(length) # wordに含まれる全ての文字列に対してfor文内の処理を実行し
# 最終結果をresに記録する
return res
更に深く学ぶ+α
【問題2】文字列操作 レベル: easy
最長のprefix文字列を特定せよ!
引数としてリストに格納された文字列が渡される。これら全ての文字列の中から最も長いprefix文字列を特定し、値を返すgetTheLongestPrefix
関数を実装せよ。
具体例
実装したgetTheLongestPrefix関数に引数を与えた時、
結果は以下のようになります。
注意事項
以下の要件にしたがって関数を設計してください
テスト
以下のテストコードをエラー無く通過できれば正解です。
あなたの回答を書き込んで関数を完成させ、Runボタンを押して確認してみましょう。
# This will get executed each time the exercise gets initialized
def getTheLongestPrefix(arg):
#ここにコードを入力してください
return your_answer
arg = ['cocatenate','conclude','code']
assert getTheLongestPrefix(arg) == 'co'
arg = ['beautiful','bee','business']
assert getTheLongestPrefix(arg1) == 'b'
arg = ['source','so','sister']
assert getTheLongestPrefix(arg1) == 's'
print('Pass!!')
<-
) to create the variable a
.解答例
少なくとも10分間は自分の頭で考えて問題を解きましょう。
10分考えても解法が浮かばない場合は解答例を見て、問題の解き方を学んでください。
def getTheLongestPrefix(strs):
n = len(strs)
if n == 0:
return ''
lcp = strs[0]
# instead of string manipulations, manipulate with the last common index
lcp_idx = len(lcp)
for i in range(1, n):
lcp_idx = min(lcp_idx, len(strs[i]))
for j in range(lcp_idx):
if lcp[j] != strs[i][j]:
lcp_idx = j
break
return lcp[:lcp_idx]
解説付き解答例
def getTheLongestPrefix(strs):
n = len(strs) # strs(リスト)の長さを取得する
if n == 0:
return '' # リストに要素が格納されていない場合
lcp = strs[0] # リスト先頭の文字列を取得する
lcp_idx = len(lcp) # 取得した文字列の文字列長を取得する
for i in range(1, n): # strs(リスト)長回繰り返す
lcp_idx = min(lcp_idx, len(strs[i])) # 先頭文字の文字列長と次に続く文字列の文字列長とを比べ
# 小さい方の値をlcp_idxに格納する
for j in range(lcp_idx):
if lcp[j] != strs[i][j]: #先頭文字列と次に続く文字列とを比べ、一致しない文字があった場合
lcp_idx = j #lcp_idxにそのインデックスを格納し、for文を抜ける
break
return lcp[:lcp_idx] #先頭文字列から一致した文字列までを返す