代码如下,仅供参考:
from random import randint
amount = int(input("随机数数量:"))
result = [randint(1,100) for i in range(amount)]
print(result)
输入:10
输出:[2, 65, 58, 24, 15, 12, 38, 24, 18, 79]
python中的list叫做列表,可以通过append方法在列表的末尾添加单个元素x = [1,2,3]
x.append(4)
或者使用extend方法在列表末位添加多个元素,参数就变成了列表
x.append([4,5,6])
或者使用insert方法在任意位置添加元素,第一个参数是插入元素的位置,第二个参数是插入元素的值
x.insert(0,-1)
如何找出数组中唯一的重复元素数字1~1000放在含有1001个元素的数组中,其中只有唯一的元素值重复。其他数字均只出现一次。设计一个算法,将重复元素找出来,要求每个数组元素只能被访问一次。如果不使用辅助存储空间,能否使用一个算法实现。
【解决方法1】累加求和法
计算机与数学本身是一家,抛开计算机的专业知识不提,上述问题其实可以回归成一个数学问题。数学问题目标是在一个数字序列寻找重复的那个数。根据题目意思可以看出,1~1000个数中除了唯一一个数重复以外,其他个数仅出现一次,由数学性质可知,这1001个数包括1到1000中每一个数各一次,外加1到1000中某一个数,很显然,1001个数中有1000个数是固定的,唯一一个不固定的数也知道其范围,那么累加求和就可以找出那个数。
以数组序列(1,3,4,2,5,3) 为例,该数组长度为6,除了数字三以外,其他四个数字没有重复。按照上述方法,首先计算数组中所有数字的和sumb,sumb=1+3+4+2+5+3=18,数组中只包含1~5的数,计算1到5一共5个数的和suma=1+2+3+4+5=15,所以重复数字为sumb-suma=3;
算法性能分析:时间复杂度为O(n),空间复杂度为O(1).
【解决方法2】环形相遇法
“判断单链表是否存在环”是一个非常经典的问题,可以转化为“已知一个单链表中存在环,找出环的入口点”这种想法。具体思路如下:将array[i]看作是第i个元素的索引,即array[i]->array[array[i]]->array[array[array[i]]]->…最终形成一个单链表,由于数组a中存在重复元素,则一定存在一个环,且环的入口即为重复元素。
算法性能分析:时间复杂度为O(n),没有申请辅助的存储空间,当数组中的元素不合理时,上述算法可能会有数组越界的可能性。可以在执行fast=array[array[fast]]slow=array[slow] *** 作的时候分别检查array[slow]与array[fast]是否会越界,如果越界,则说明提供的数据不合法。
【解决方法3】异或法
根据异或运算的性质可知,当相同元素异或时,其运算结果为0,当不同元素异或时,其运算结果为非0,任何数与数字与0异或时,其运算结果为该数。以数组(1,3,4,2,5,3)为例。(1 ^ 3 ^ 4 ^ 2 ^ 5 ^ 3 ) ^ (1^ 2^ 3^ 4^ 5)=0^ 0^ 3^ 0^0.
代码如下:
算法性能分析:时间复杂度为O(n),没有申请辅助存储空间
【解决方法3】数据映射法
数组取值可以看成是一个特殊的函数f:D—>R,定义域为下标值1~1000,值域为1 ~ 1000,如果对于任何一个数i,f(i)叫做它的后继,i叫f(i)的前驱。0只有后继,没有前驱,其他数字有前驱也有后继,重复的那个数有两个前驱。以数组array=(1,3,4,3,5,2)为例,从下标0开始遍历数组。
(1)array[0]=1,遍历下标为1的元素,同时标记已经遍历过的元素(变为相反数),array=
(-1,3,4,3,5,2)
(2)array[1]=3,遍历下标为3的元素,同时标记已经遍历过的元素,array=(-1,-3,4,3,5,2)
(3)array[3]=3,遍历下标为3的元素,同时标记已经遍历过的元素,array=(-1,-3,4,-3,5,2)
(4)array[3]=-3,3已经遍历过,找到了重复元素。
算法性能分析:时间复杂度为O(n),也没有申请辅助的存储空间。
这种方法的缺点:修改了数组中元素的值。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)