2 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超6個(gè)贊
問題的要點(diǎn)要求給定一系列空格分隔的整數(shù),將列表分為存儲(chǔ)在隊(duì)列中的素?cái)?shù)和存儲(chǔ)在堆棧中的復(fù)合整數(shù)。按 FIFO 順序輸出隊(duì)列中的素?cái)?shù),并按 LIFO 順序輸出堆棧中的復(fù)合整數(shù)。
隊(duì)列是線性先進(jìn)先出 (FIFO) 數(shù)據(jù)結(jié)構(gòu)。如果我們使用append()來實(shí)現(xiàn)enqueue(),使用pop()來實(shí)現(xiàn)dequeue(),那么List數(shù)據(jù)結(jié)構(gòu)就可以用作隊(duì)列。然而,列表為此目的非常慢,因?yàn)樵陂_頭插入或刪除元素需要 O(n) 時(shí)間。使用集合 mnodule 中的出隊(duì)類是首選隊(duì)列實(shí)現(xiàn)機(jī)制,因?yàn)樽芳雍蛷棾霾僮餍枰?O(1) 時(shí)間。
堆棧是線性后進(jìn)/先出 (LIFO) 或先入/后出 (FILO) 數(shù)據(jù)結(jié)構(gòu)。與隊(duì)列類似,列表數(shù)據(jù)結(jié)構(gòu)可以用來實(shí)現(xiàn)堆棧,但是與隊(duì)列情況一樣,如果列表很長,就會(huì)出現(xiàn)性能問題。因此,出隊(duì)類是實(shí)現(xiàn)堆棧的首選。
根據(jù)指令,第一行輸入給出第二行輸入中的整數(shù)個(gè)數(shù)。
第二行由空格分隔的整數(shù)組成。輸出由兩行組成。
第一個(gè)輸出行應(yīng)按照輸入的順序顯示輸入中的素?cái)?shù)。
第二行應(yīng)以與輸入相反的順序顯示輸入中的合數(shù)。
這是我解決問題的方法:
#Utility to detect a Prime
def is_prime(n: int) -> bool:
"""
Integer -> Boolean
returns True if n is a prime number
"""
if n == 2 or n == 3: return True
if n < 2 or n%2 == 0: return False
if n < 9: return True
if n%3 == 0: return False
r = int(sqrt(n))
f = 5
while f <= r:
if n%f == 0:
return False
if n%(f+2) == 0:
return False
f +=6
return True
使用列表方法
# Implementation with Lists assuming instr is list of integers
def list_method(instr: str):
qlist = []
stklist = []
inLst = list(map(lambda x:int(x) ,instr.split()))
for n in inLst:
if is_prime(n):
qlist.append(n)
else:
stklist.append(n)
print(" ".join(map(lambda x: str(x), qlist)))
print(" ".join(map(lambda x: str(x), stklist[::-1])))
使用出隊(duì)類
from collections import deque
def queue_method(instr: str):
q = deque()
stk = deque()
inLst = list(map(lambda x:int(x) ,instr.split()))
for n in inLst:
if is_prime(n):
q.append(n)
else:
stk.append(n)
print(" ".join([str(q.popleft()) for i in range(len(q))]))
print(" ".join([str(stk.pop()) for i in range(len(stk))]))

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊
這是使用埃拉托斯特尼篩法和 2 個(gè)數(shù)組的簡單方法。
num1 = [7,21,18,3,12] # your list
n = max(num1)
prime = [True for i in range(n+1)]
p = 2
while (p * p <= n): #creating a Sieve using standard operations
if (prime[p] == True):
for i in range(p * p, n+1, p):
prime[i] = False
p += 1
prim, comp = [], []
for i in num1:
if prime[i]:
prim.append(i)
else:
comp.append(i)
for i in prim:
print(i, end = " ")
print()
for i in comp[::-1]:
print(i, end = " ")
print()
添加回答
舉報(bào)