python入門知的障害問題
11681 ワード
1.リスト並べ替え説明:リストLをあげて、Lを昇順に並べ替えて、並べ替え後のリストを出力します.
2.文字列の逆順序の説明:文字列aをあげます.逆順序の後のaを出力してください.例えば、a=‘xydz’
出力:zdyx分析:リストが与えられている場合は直接reverseでよいが、文字列であり、改行を制御するのがあまりよくないことが分かったので、直接命令を出した:a[:-1]またはa[-1:-1]
3.出力辞書key記述:a={1:1,2:2,3:3}のような辞書aを与え、出力辞書aのkeyを','で接続し、例えば'1,2,3'を与える.keyは辞書順に昇順に並べられるように要求されます(keyは文字列である可能性があります).
例えば、a={1:1,2:2,3:3}の場合、出力:1,2,3
分析:ここでは辞書をどのように遍歴するかの知識が必要で、辞書の前はキーの後ろの名前です.(1)辞書を巡回するキー:for key in a.keys():(2)辞書の値を巡回する:for val in a.values():(3)辞書全体を巡回する:for key,val in a.items():
これを知るのは簡単だ
PS:joinの使い方を説明します.join(b)は、b文字列を‘,’でつなぎ合わせて文字列/str(i)を構成し、iという整数を文字列4に変換することを意味する.出力文字奇数位置の文字列
説明:aの奇数の位置文字からなる文字列(位置番号は1から)を出力する文字列aを与えます.
例えば、a=‘xyzwd’
出力:xzd
分析:簡単な暴力の方法は直接for循環です
簡単な方法はスライス:print(a[0:len(a):2]).a[0:0:len(a):2]は、0~len(a)-1から2文字ずつ間隔を空けることを表す
5.100以内のすべての素数の説明を解く:100以内のすべての素数を出力し、素数の間を1つのスペースで区別する(最後の数字の後にスペースがないことに注意).
解析:定義関数def+関数名(パラメータリスト)を使用します.
6.矩形面積を求める
説明:矩形長a,幅bが知られており、その面積と周長を出力し、面積と周長をスペースで隔てている.
例えば、a=3、b=8
出力:24 22分析:主にどのようにスペースを出力するかで、スペースを文字列として一緒に入れるだけでよい.
別の方法もあります.
7.時間はお金
説明:2つの時間stとet(00:00:00<=st<=et<=23:59:59)を与えます.この2つの時間間隔の秒数を与えてください.例えば、st="00:00:00",et="00:00:10"の場合、出力10.
分析:splitの使い方
8.公約数の個数の説明:2つの正の整数a,bをあげて、それらの公約数の個数を出力します.
例えば、a=24、b=36
出力:6
分析:まず両者の最大公約数を求め、整数分解の唯一の分解定理に基づいてその因子個数、さらに両者の公約数の個数を得ることができる.
9.一馬当前説明:将棋を打ったことがある人はみな知っているが、馬は「日」の字形(90°回転する日を含む)しか歩けない.n=1,m=2のように、少なくとも1ステップが必要である.n=1,m=3の場合、−1が出力される.分析:初めてpyでbfsを書きます.このテーマはpyのキュー使用、deque両端キューなど多くのことを学びました.同時に辞書をタグ配列として同時に問題を初期化する.2 Dリストなど
10.同じ数字
説明:整数リストLをあげて、Lの中に同じ数字があるかどうかを判断して、もし存在するならば、YESを出力して、さもなくばNOを出力します.
分析:簡単に並べ替えて、隣に同じものがあるかどうかを見ることができます.
しかし、もっと簡単な方法はpythonのset()を利用して、set(L)はLというリストの中の異なる要素を1つの集合をして、中には重複要素が含まれていません.最後に得られたlen(L)とlen(set(L))の長さが異なると、必ず重複する方法があります.
11.フォーマット時間
説明:時間t(tは辞書で、全部で6つの文字列key(year,month,day,hour,minute,second)をあげます.値は各値が数字からなる文字列です.例えば、t={‘year’:’2013’,’month’:’9’,day’:’30’,’hour’:’16’,’minute’:’45’,’second’:’2’}は以下のフォーマットで出力してください.フォーマット:XXXXXX-XX-XX X:X:XX:XX.前例のように出力すべき:2013-09-30 16:45:02.
解析:zここではビット数が足りないとプリアンブル0を補う必要がないことを考慮して簡単なzfill用法を用い,文字列になり,右揃えが足りない.
L.sort()
print(L)
2.文字列の逆順序の説明:文字列aをあげます.逆順序の後のaを出力してください.例えば、a=‘xydz’
出力:zdyx分析:リストが与えられている場合は直接reverseでよいが、文字列であり、改行を制御するのがあまりよくないことが分かったので、直接命令を出した:a[:-1]またはa[-1:-1]
3.出力辞書key記述:a={1:1,2:2,3:3}のような辞書aを与え、出力辞書aのkeyを','で接続し、例えば'1,2,3'を与える.keyは辞書順に昇順に並べられるように要求されます(keyは文字列である可能性があります).
例えば、a={1:1,2:2,3:3}の場合、出力:1,2,3
分析:ここでは辞書をどのように遍歴するかの知識が必要で、辞書の前はキーの後ろの名前です.(1)辞書を巡回するキー:for key in a.keys():(2)辞書の値を巡回する:for val in a.values():(3)辞書全体を巡回する:for key,val in a.items():
これを知るのは簡単だ
#a={1:1,2:2,3:3}
b = []
for key in a.keys():
b.append(key)
b.sort()
print(",".join(str(x) for x in b))
PS:joinの使い方を説明します.join(b)は、b文字列を‘,’でつなぎ合わせて文字列/str(i)を構成し、iという整数を文字列4に変換することを意味する.出力文字奇数位置の文字列
説明:aの奇数の位置文字からなる文字列(位置番号は1から)を出力する文字列aを与えます.
例えば、a=‘xyzwd’
出力:xzd
分析:簡単な暴力の方法は直接for循環です
#a = 'xyzwd'
b = [];
for i in range(0,len(a),2):
b.append(a[i])
print(''.join(b))
簡単な方法はスライス:print(a[0:len(a):2]).a[0:0:len(a):2]は、0~len(a)-1から2文字ずつ間隔を空けることを表す
5.100以内のすべての素数の説明を解く:100以内のすべての素数を出力し、素数の間を1つのスペースで区別する(最後の数字の後にスペースがないことに注意).
解析:定義関数def+関数名(パラメータリスト)を使用します.
def isPrime(n):
if n < 2:
return False
else :
for i in range(2,n) :
if n % i == 0 :
return False
return True
a = []
for i in range(2,101):
if isPrime(i):
a.append(i)
print(" ".join(str(g) for g in a ))
6.矩形面積を求める
説明:矩形長a,幅bが知られており、その面積と周長を出力し、面積と周長をスペースで隔てている.
例えば、a=3、b=8
出力:24 22分析:主にどのようにスペースを出力するかで、スペースを文字列として一緒に入れるだけでよい.
#a = 3
#b = 8
c = ' '
print(str(a*b) + c + str(2*(a+b)))
別の方法もあります.
x = a * b
y = 2*(a+b)
print('%s %s'%(x,y))
7.時間はお金
説明:2つの時間stとet(00:00:00<=st<=et<=23:59:59)を与えます.この2つの時間間隔の秒数を与えてください.例えば、st="00:00:00",et="00:00:10"の場合、出力10.
分析:splitの使い方
a = st.split(':')
b = et.split(':')
print((int(b[0])-int(a[0]))*3600+(int(b[1])-int(a[1]))*60+int(b[2])-int(a[2]))
8.公約数の個数の説明:2つの正の整数a,bをあげて、それらの公約数の個数を出力します.
例えば、a=24、b=36
出力:6
分析:まず両者の最大公約数を求め、整数分解の唯一の分解定理に基づいてその因子個数、さらに両者の公約数の個数を得ることができる.
#a = 24
#b = 36
def gcd(x,y):
while(y):
r = x % y
x = y
y = r
return x
gg = gcd(a,b)
l = []
for i in range(2,gg+1):
if gg % i == 0:
num = 0
while(gg % i == 0):
num = num + 1
gg = gg / i
l.append(num)
ans = 1
for i in l :
ans = ans * (i + 1)
print(ans)
9.一馬当前説明:将棋を打ったことがある人はみな知っているが、馬は「日」の字形(90°回転する日を含む)しか歩けない.n=1,m=2のように、少なくとも1ステップが必要である.n=1,m=3の場合、−1が出力される.分析:初めてpyでbfsを書きます.このテーマはpyのキュー使用、deque両端キューなど多くのことを学びました.同時に辞書をタグ配列として同時に問題を初期化する.2 Dリストなど
from collections import deque
go = [(-2,-1),(-2,1),(-1,2),(1,2),(2,1),(2,-1),(1,-2),(-1,-2)]//
def bfs (n,m) :
book = {(x, y): False for x in range(0,n+1) for y in range(0,m+1)}
//
book[(0,0)] = True//
q = deque([(0,0,0)])//deque
while len(q) > 0:
p = q.popleft()//
for i in range(0,8):
x = p[0] + go[i][0]
y = p[1] + go[i][1]
if x < 0 or x > n or y < 0 or y > m:
continue
if book[(x,y)] == True:
continue
book[(x,y)] = True
q.append((x,y,p[2]+1))
if x == n and y == m :
return p[2]+1
return -1
print(bfs(n,m))
10.同じ数字
説明:整数リストLをあげて、Lの中に同じ数字があるかどうかを判断して、もし存在するならば、YESを出力して、さもなくばNOを出力します.
分析:簡単に並べ替えて、隣に同じものがあるかどうかを見ることができます.
#L = [1,1,2,2,3]
L.sort()
flag = False
for i in range(0,len(L)-1):
if L[i] == L[i+1]:
print("YES")
flag = True
break
if flag == False:
print("NO")
しかし、もっと簡単な方法はpythonのset()を利用して、set(L)はLというリストの中の異なる要素を1つの集合をして、中には重複要素が含まれていません.最後に得られたlen(L)とlen(set(L))の長さが異なると、必ず重複する方法があります.
if len(L) - len(set(L)) > 0:
print("YES")
else:
prnit("NO")
11.フォーマット時間
説明:時間t(tは辞書で、全部で6つの文字列key(year,month,day,hour,minute,second)をあげます.値は各値が数字からなる文字列です.例えば、t={‘year’:’2013’,’month’:’9’,day’:’30’,’hour’:’16’,’minute’:’45’,’second’:’2’}は以下のフォーマットで出力してください.フォーマット:XXXXXX-XX-XX X:X:XX:XX.前例のように出力すべき:2013-09-30 16:45:02.
解析:zここではビット数が足りないとプリアンブル0を補う必要がないことを考慮して簡単なzfill用法を用い,文字列になり,右揃えが足りない.
res = t['year'].zfill(4)+'-'+t['month'].zfill(2)+'-'+t['day'].zfill(2)+' '+t['hour'].zfill(2)+':'+t['minute'].zfill(2)+':'+t['second'].zfill(2)
print(res)