#【python】指定回数繰り返す文字列のaの数を求めるプログラミング
▼設問
- listで任意の長さの文字列が与えられる(s)
- 文字数が与えられる。(n)
- sを文字数(n)を満たすまで繰り返した中に含まれるaの数を求める。
▼sample input
s ="aba"
n =10
▼sample output
7
image
abaabaabaa <- aが7個
▼my answer
def repeatedString(s, n):
a = s.count("a")
ans=i=0
#余った文字に含まれるaの数を求める
r = n%len(s)
if r!=0:
while i<r:
if s[i]=="a":
ans += 1
i+=1
ans += a*int(n/len(s))
return ans
if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w')
s = input()
n = int(input())
result = repeatedString(s, n)
fptr.write(str(result) + '\n')
fptr.close()
- 決められたオブジェクトから要素を抜き出す場合はfor
- 指定条件になるまで繰り返す場合はwhile
上記while文は「for i in range(r)」で置き換え可能。
whileをforに置き換え
def repeatedString(s, n):
a = s.count("a")
ans=0
#繰り返しの数を求める(math.floorは使わない)
r = n%len(s)
if r!=0:
for i in range(r):
if s[i]=="a":
ans += 1
ans += a*int(n/len(s))
return ans
repeatedString(s, n)
####if文を一文にし、内包表記に書き換える。
▼処理
- 余りの文字数文list sから要素を抜き出し、aなら1、それ以外なら0を格納したlistを作る。
- sum(list)で1を足し上げる。
内包表記
def repeatedString(s, n):
a = s.count("a")
ans=0
#繰り返しの数を求める(math.floorは使わない)
r = n%len(s)
if r!=0:
ans = sum([(1 if s[i]=="a" else 0) for i in range(r)])
ans += a*int(n/len(s))
return ans
repeatedString(s, n)
##補足:MemoryError
指定文字数分の繰り返した文字列を作成し、そこからaの数をカウントしたが、数が大きい場合にMemoryErrorになってしまう。
s ="babbaabbabaababaaabbbbbbbababbbabbbababaabbbbaaaaabbaababaaabaabbabababaabaabbbababaabbabbbababbaabb"
n = 860622337747
▼文字列を求める処理は重い。
def repeatedString(s, n):
#繰り上げ(math.floorは使わない)
if float(n/len(s)):
r = int(n/len(s)) +1
else:
r = n/len(s)
#文字列を求める
ans = x = 0
ss = s*r
for letter in ss:
x += 1
if x>n:
break
elif letter == "a":
ans += 1
return ans
repeatedString(s, n)
#MemoryError: