鱼C论坛

 找回密码
 立即注册
查看: 4025|回复: 21

[已解决]Python:【新】每日一题 2

[复制链接]
发表于 2021-3-18 17:53:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 liuzhengyuan 于 2021-3-21 20:58 编辑

专辑说明(积分规则)

今天的题目:


一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

请封装成一个函数,nums 为参数

示例 1:

输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
示例 2:

输入:nums = [1,2,10,4,1,4,3,3]
输出:[2,10] 或 [10,2]
限制:

2 <= nums.length <= 10000

欢迎大家来答题


来源:力扣(LeetCode)
最佳答案
2021-3-19 10:00:52
  1. def test(nums):
  2.     length = len(nums)
  3.     result = []

  4.     if length < 2:
  5.         print('error nums...')
  6.         return result

  7.     nums.sort()
  8.     i = 0
  9.     while i < length-1:
  10.         if nums[i] == nums[i+1]:
  11.             i+=2
  12.             if i == length - 1:
  13.                 result.append(nums[i])
  14.         else:
  15.             result.append(nums[i])
  16.             i+=1
  17.     return result

  18. nums = [-5, 1, 6, -3, 6, -3, 1, 10]
  19. list1 = test(nums)
  20. print(list1)
复制代码

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-3-19 00:32:30 | 显示全部楼层

  1. def findone(str):
  2.     str2 = []
  3.     for each1 in str:
  4.         count = 0
  5.         for each2 in str:
  6.             if each1 == each2:
  7.                 count += 1
  8.         if count == 1:
  9.             str2.append(each1)
  10.     print(str2)
  11. a = [4,6,4,2]
  12. findone(a)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-19 00:49:32 | 显示全部楼层
  1. def findNum(nums):
  2.     dt = dict()
  3.     for i in nums:
  4.         dt[i] = dt.get(i,0) + 1
  5.     return [k for k,v in dt.items() if v == 1]

  6. print(findNum([4,1,4,6]))
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
liuzhengyuan + 4 + 4 48ms 14.3mb

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-3-19 08:49:10 | 显示全部楼层

空间复杂度是不是不符合题目要求?要求空间复杂度不随数据量增加而变化:O(1)。但是你使用了字典,字典的大小会随着你的输入数据量增加而增大。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-19 08:54:35 | 显示全部楼层

对字符串进行了嵌套循环,时间复杂度符合题目要求么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-19 10:00:52 | 显示全部楼层    本楼为最佳答案   
  1. def test(nums):
  2.     length = len(nums)
  3.     result = []

  4.     if length < 2:
  5.         print('error nums...')
  6.         return result

  7.     nums.sort()
  8.     i = 0
  9.     while i < length-1:
  10.         if nums[i] == nums[i+1]:
  11.             i+=2
  12.             if i == length - 1:
  13.                 result.append(nums[i])
  14.         else:
  15.             result.append(nums[i])
  16.             i+=1
  17.     return result

  18. nums = [-5, 1, 6, -3, 6, -3, 1, 10]
  19. list1 = test(nums)
  20. print(list1)
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
liuzhengyuan + 4 + 4 44ms 13.7mb

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2021-3-19 10:14:36 | 显示全部楼层
coolsummer2080 发表于 2021-3-19 08:54
对字符串进行了嵌套循环,时间复杂度符合题目要求么?

嗯,我才去了解了一下时间复杂度与空间复杂度,我再想想
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-19 10:49:45 | 显示全部楼层
coolsummer2080 发表于 2021-3-19 08:49
空间复杂度是不是不符合题目要求?要求空间复杂度不随数据量增加而变化:O(1)。但是你使用了字典,字典 ...

那他给的就是一个列表,本身空间复杂度不就不是O(1)了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-19 10:53:32 | 显示全部楼层
如果有数组不影响空间复杂度的话,我觉得这次应该可以了
只有一个循环了

  1. def findone(str):
  2.     a = str
  3.     b = []
  4.     for i in a:
  5.         n = a.count(i)
  6.         if n ==1:
  7.             b.append(i)
  8.     print(b)
  9. nums = [4,6,4,2]
  10. findone(nums)
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
liuzhengyuan + 4 + 4 9325ms 13.9mb

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-19 11:08:54 | 显示全部楼层
yuedong 发表于 2021-3-19 10:53
如果有数组不影响空间复杂度的话,我觉得这次应该可以了
只有一个循环了

实际上这个是个算法题目,并不是方法题,要是再加上一条,每个元素只允许访问一次,你怎么破?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-19 11:25:46 | 显示全部楼层
  1. def fun1(nums):
  2.     result=[]
  3.     for each in nums:
  4.         if nums.count(each)==1:
  5.             result.append(each)
  6.     return result

  7. nums=[1,2,10,4,1,4,3,3]
  8. print(fun1(nums))
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
liuzhengyuan + 4 + 4 9388ms 13.9mb

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-19 11:38:23 | 显示全部楼层
coolsummer2080 发表于 2021-3-19 08:49
空间复杂度是不是不符合题目要求?要求空间复杂度不随数据量增加而变化:O(1)。但是你使用了字典,字典 ...

对算法还无系统了解,先抛砖引玉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-19 16:02:46 | 显示全部楼层
yuedong 发表于 2021-3-19 10:49
那他给的就是一个列表,本身空间复杂度不就不是O(1)了?

给的列表应该不包括再内,题意是不是说的你自己用的空间应该是一个常量。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 01:02:03 | 显示全部楼层
  1. def num(nums):
  2.     nums = sorted(nums)
  3.     i = 0
  4.     while i <= 2:
  5.         if i < len(nums)-1 and not nums[i] ^ nums[i+1] :
  6.             nums.remove(nums[i])
  7.             nums.remove(nums[i])
  8.             i -=1
  9.         i += 1
  10.     return nums

  11. print(num([4,1,4,6]))
  12. print(num([1,2,10,4,1,4,3,3]))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 01:21:31 | 显示全部楼层
在优化一下...
  1. def num(nums):
  2.     nums = sorted(nums)
  3.     i = 0
  4.     while i < 2:
  5.         if i < len(nums)-1 and not nums[i] ^ nums[i+1] :
  6.             nums.remove(nums[i])
  7.             nums.remove(nums[i])
  8.             i -=1
  9.         i += 1

  10.     if len(nums) >2:
  11.         return nums[0:2]
  12.     return nums

  13. print(num([4,1,4,6]))
  14. print(num([1,2,10,4,1,4,3,3]))
  15. print(num([1,2,3,3,4,4,5,5]))
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
liuzhengyuan + 4 + 4 116ms 13.6mb

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-20 07:56:05 | 显示全部楼层
-------------------------分割线--------------------
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 08:12:02 | 显示全部楼层
  1. lst = [1,2,3,4,5,6,7,8,3,4,5,6,7,8]
  2. print([x for x in lst if lst.count(x) == 1])
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 16:47:20 | 显示全部楼层
运算时间如何缩短?有没有大佬推荐点链接学习学习?我的代码运行时间是9388ms,最低的大佬只用44ms,差在哪了?要显著提高效率,主要关注的点有哪些?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 17:34:49 | 显示全部楼层
  1. def num(nums):
  2.     nums = sorted(nums)
  3.     i = 0
  4.     while i < 2:
  5.         if i < len(nums)-1 and not nums[i] ^ nums[i+1] :     #请教一下,后半句nums[i]^nums[i+1]的作用是什么?
  6.             nums.remove(nums[i])
  7.             nums.remove(nums[i])
  8.             i -=1
  9.         i += 1

  10.     if len(nums) >2:
  11.         return nums[0:2]
  12.     return nums

  13. print(num([4,1,4,6]))
  14. print(num([1,2,10,4,1,4,3,3]))
  15. print(num([1,2,3,3,4,4,5,5]))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 19:01:25 From FishC Mobile | 显示全部楼层
本帖最后由 qq1151985918 于 2021-3-20 19:12 编辑

我都搞不清楚了,这个题不是很简单吗?怎么搞的这么复杂的样子?难道是我没理解?
  1. def find(nums):
  2.     return [x for x in nums if nums.count(x) == 1]

  3. lst = [1,2,3,4,5,6,7,8,3,4,5,6,7,8]
  4. print(find(lst))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-20 05:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表