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()
添加回答
举报