2 回答

TA貢獻1802條經驗 獲得超6個贊
問題的要點要求給定一系列空格分隔的整數,將列表分為存儲在隊列中的素數和存儲在堆棧中的復合整數。按 FIFO 順序輸出隊列中的素數,并按 LIFO 順序輸出堆棧中的復合整數。
隊列是線性先進先出 (FIFO) 數據結構。如果我們使用append()來實現enqueue(),使用pop()來實現dequeue(),那么List數據結構就可以用作隊列。然而,列表為此目的非常慢,因為在開頭插入或刪除元素需要 O(n) 時間。使用集合 mnodule 中的出隊類是首選隊列實現機制,因為追加和彈出操作需要 O(1) 時間。
堆棧是線性后進/先出 (LIFO) 或先入/后出 (FILO) 數據結構。與隊列類似,列表數據結構可以用來實現堆棧,但是與隊列情況一樣,如果列表很長,就會出現性能問題。因此,出隊類是實現堆棧的首選。
根據指令,第一行輸入給出第二行輸入中的整數個數。
第二行由空格分隔的整數組成。輸出由兩行組成。
第一個輸出行應按照輸入的順序顯示輸入中的素數。
第二行應以與輸入相反的順序顯示輸入中的合數。
這是我解決問題的方法:
#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])))
使用出隊類
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貢獻1801條經驗 獲得超8個贊
這是使用埃拉托斯特尼篩法和 2 個數組的簡單方法。
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()
添加回答
舉報