LoginSignup
1
2

More than 3 years have passed since last update.

【python】指定回数繰り返す文字列のaの数を求めるプログラミング。

Posted at

【python】指定回数繰り返す文字列のaの数を求めるプログラミング

▼設問

  • listで任意の長さの文字列が与えられる(s)
  • 文字数が与えられる。(n)
  • sを文字数(n)を満たすまで繰り返した中に含まれるaの数を求める。

URL

▼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:
1
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2