鱼C论坛

 找回密码
 立即注册
查看: 3477|回复: 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
def test(nums):
    length = len(nums)
    result = []

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

    nums.sort()
    i = 0
    while i < length-1:
        if nums[i] == nums[i+1]:
            i+=2
            if i == length - 1:
                result.append(nums[i])
        else:
            result.append(nums[i])
            i+=1
    return result

nums = [-5, 1, 6, -3, 6, -3, 1, 10]
list1 = test(nums)
print(list1)

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-3-19 00:32:30 | 显示全部楼层
def findone(str):
    str2 = []
    for each1 in str:
        count = 0
        for each2 in str:
            if each1 == each2:
                count += 1
        if count == 1:
            str2.append(each1)
    print(str2)
a = [4,6,4,2]
findone(a)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

print(findNum([4,1,4,6]))

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

空间复杂度是不是不符合题目要求?要求空间复杂度不随数据量增加而变化:O(1)。但是你使用了字典,字典的大小会随着你的输入数据量增加而增大。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

对字符串进行了嵌套循环,时间复杂度符合题目要求么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

    nums.sort()
    i = 0
    while i < length-1:
        if nums[i] == nums[i+1]:
            i+=2
            if i == length - 1:
                result.append(nums[i])
        else:
            result.append(nums[i])
            i+=1
    return result

nums = [-5, 1, 6, -3, 6, -3, 1, 10]
list1 = test(nums)
print(list1)

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

嗯,我才去了解了一下时间复杂度与空间复杂度,我再想想
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那他给的就是一个列表,本身空间复杂度不就不是O(1)了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-19 10:53:32 | 显示全部楼层
如果有数组不影响空间复杂度的话,我觉得这次应该可以了
只有一个循环了
def findone(str):
    a = str
    b = []
    for i in a:
        n = a.count(i)
        if n ==1:
            b.append(i)
    print(b)
nums = [4,6,4,2]
findone(nums)

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

实际上这个是个算法题目,并不是方法题,要是再加上一条,每个元素只允许访问一次,你怎么破?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

nums=[1,2,10,4,1,4,3,3]
print(fun1(nums))

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

对算法还无系统了解,先抛砖引玉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

给的列表应该不包括再内,题意是不是说的你自己用的空间应该是一个常量。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

print(num([4,1,4,6]))
print(num([1,2,10,4,1,4,3,3]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

    if len(nums) >2:
        return nums[0:2]
    return nums

print(num([4,1,4,6]))
print(num([1,2,10,4,1,4,3,3]))
print(num([1,2,3,3,4,4,5,5]))

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-3-20 07:56:05 | 显示全部楼层
-------------------------分割线--------------------
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-3-20 08:12:02 | 显示全部楼层
lst = [1,2,3,4,5,6,7,8,3,4,5,6,7,8]
print([x for x in lst if lst.count(x) == 1])
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

    if len(nums) >2:
        return nums[0:2]
    return nums

print(num([4,1,4,6]))
print(num([1,2,10,4,1,4,3,3]))
print(num([1,2,3,3,4,4,5,5]))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

lst = [1,2,3,4,5,6,7,8,3,4,5,6,7,8]
print(find(lst))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 01:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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