我只會python QQ,python跑得慢很容易TLE。
所以要想辦法優化計算步驟。
我一開始是用lines = stdin.readlines()。產生一個lines的list,再從list一個一個讀,顯然建立list,依序從list讀取會拖慢速度。
之後改成每一步驟都讀一行,例如:
from sys import stdin
while True:
# 先讀取一行,為密碼,如果是EOF就break,
s = stdin.readline().strip()
if s.strip() == "":
break
pwd = s.replace(" ","")
# 讀取猜測次數
guess_time = int(stdin.readline())
for _ in range(guess_time):
pwd_temp = pwd
# 讀取猜測的內容
guess = stdin.readline().strip().replace(" ","")
我的解法是盡量不要用到list,把字串本身當成list來用。
我的算法是從右到左比對,如果說pwd_temp和guess的那個字元一樣,就A+=1,然後把那個字元刪掉。
先把A的狀況處理完,再來看B的狀況。
這裡特別注意一下,假設密碼是9 9 1 9,猜測是1 1 0 1,這樣子會變成0A1B。
以下是解題參考,中間那邊的一堆if,其實可以弄成for loop,但是我懶得想,反正也過了。
from sys import stdin
while True:
s = stdin.readline().strip()
if s.strip() == "":
break
pwd = s.replace(" ","")
guess_time = int(stdin.readline())
for _ in range(guess_time):
pwd_temp = pwd
guess = stdin.readline().strip().replace(" ","")
A = 0
B = 0
if pwd_temp[3] == guess[3]:
A += 1
pwd_temp = pwd_temp[0:3]
guess = guess[0:3]
if pwd_temp[2] == guess[2]:
A += 1
pwd_temp = pwd_temp[0:2] + pwd_temp[3:]
guess = guess[0:2] + guess[3:]
if pwd_temp[1] == guess[1]:
A += 1
pwd_temp = pwd_temp[0:1] + pwd_temp[2:]
guess = guess[0:1] + guess[2:]
if pwd_temp[0] == guess[0]:
A += 1
pwd_temp = pwd_temp[1:]
guess = guess[1:]
for g in guess:
if g in pwd_temp:
pwd_temp = pwd_temp.replace(g,"Z",1)
B += 1
print(f"{A}A{B}B")
我只會python QQ,python跑得慢很容易TLE。
所以要想辦法優化計算步驟。我一開始是用
lines = stdin.readlines()。產生一個lines的list,再從list一個一個讀,顯然建立list,依序從list讀取會拖慢速度。
之後改成每一步驟都讀一行,例如:from sys import stdin
while True:
# 先讀取一行,為密碼,如果是EOF就break,
s = stdin.readline().strip()
if s.strip() == "":
break
pwd = s.replace(" ","")
# 讀取猜測次數
guess_time = int(stdin.readline())
for _ in range(guess_time):
pwd_temp = pwd
# 讀取猜測的內容
guess = stdin.readline().strip().replace(" ","")我的解法是盡量不要用到list,把字串本身當成list來用。
我的算法是從右到左比對,如果說pwd_temp和guess的那個字元一樣,就A+=1,然後把那個字元刪掉。先把A的狀況處理完,再來看B的狀況。
這裡特別注意一下,假設密碼是9 9 1 9,猜測是1 1 0 1,這樣子會變成0A1B。
以下是解題參考,中間那邊的一堆
if,其實可以弄成forloop,但是我懶得想,反正也過了。from sys import stdin while True: s = stdin.readline().strip() if s.strip() == "": break pwd = s.replace(" ","") guess_time = int(stdin.readline()) for _ in range(guess_time): pwd_temp = pwd guess = stdin.readline().strip().replace(" ","") A = 0 B = 0 if pwd_temp[3] == guess[3]: A += 1 pwd_temp = pwd_temp[0:3] guess = guess[0:3] if pwd_temp[2] == guess[2]: A += 1 pwd_temp = pwd_temp[0:2] + pwd_temp[3:] guess = guess[0:2] + guess[3:] if pwd_temp[1] == guess[1]: A += 1 pwd_temp = pwd_temp[0:1] + pwd_temp[2:] guess = guess[0:1] + guess[2:] if pwd_temp[0] == guess[0]: A += 1 pwd_temp = pwd_temp[1:] guess = guess[1:] for g in guess: if g in pwd_temp: pwd_temp = pwd_temp.replace(g,"Z",1) B += 1 print(f"{A}A{B}B")
我講的那些優化速度邏輯,可能有誤。
stdin.readline()真的有比stdin.readlines()或是stdin.read()還快嗎? 可能沒有
另外,我在處理字串時,沒有轉換成list確實省時間,但是我頻繁的切片,也會造成拖慢速度,這也是可以優化的點。