牛牛有一个长度为n的数组a,数组下标从1~n。牛牛每一次会将a中所有下标为非质数的元素进行删除,即aj且j不为质数。在删除完成之后,牛牛会将数组a重新按顺序拼接起来。牛牛不断循环和这个过程,直到数组a的大小为1。牛牛现在给你这个数组,他想知道这个数组最后剩下的那个元素值是多少呢,请告诉牛牛。
注:1不是质数
(本题是核心模式,不需要自己处理输入输出,完成函数即可)
示例1
[1,2,3,4]
输出
3
说明
第一次数组会变成[2,3]。
第二次数组会变成[3]。
示例2
[3,1,1,4,5,6]
输出
5
说明
第一次数组会变成[1,1,5]。
第二次数组会变成[1,5]。
第三次数组会变成[5]。
示例3
[6]
输出
6
说明
只有一个元素,直接返回,不需要任何操作。
备注:
2<=n<=2*(10^5)
1<=ai<=10^5
思路:
写一个判断是否为质数的代码,由于删除的过程,会导致数组元素的下标错乱,故将删除操作转化为添加操作。最简单的思路是:用另一个数组去添加质数元素,之后进行数组之间的深拷贝(python),当数组元素长度为1时候,即返回。注意初始时候元素个数为1的特殊情况,附上python代码:
import copy
class Solution:
# 质数 返回true
def isPrime(self,num):
if num == 1:
return False
if num > 1:
# 查看因子
for i in range(2, num):
if (num % i) == 0:
return False
return True
def getNum(self,a):
#特殊情况
if len(a) == 1:
return a[0]
while True:
#临时数组,存放质数
b=[]
for k in range(len(a)):
#质数存起来,存到b中
if self.isPrime(k+1):
b.append(a[k])
#print(b)
#数组中只有一个元素了
if len(b)==1:
return b[0]
#python深拷贝
a=copy.deepcopy(b)
if __name__ == "__main__":
solution=Solution()
testList1 = [1, 2, 3, 4]
testList2 = [3, 1, 1, 4, 5, 6]
testList3 = [9]
print(solution.getNum(testList2))