鱼C论坛

 找回密码
 立即注册
查看: 4561|回复: 57

[已解决]Python:每日一题 359

[复制链接]
发表于 2020-3-26 13:27:16 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 zltzlt 于 2020-3-26 13:27 编辑

今天的题目:


数组 nums 原本包含从 1 到 n 的整数。但因为数据错误,导致 nums 丢失了一个整数并且有一个元素重复。

首先寻找到重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。

示例 1:

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

输入:nums = [1, 2, 3, 4, 5, 5, 7]
输出:[5, 6]
示例 3:

输入:nums = [1, 2, 3, 4, 5, 6, 7, 7, 9]
输出:[7, 8]


欢迎大家一起答题!
最佳答案
2020-3-26 15:04:03
  1. def f359(nums):
  2.     sn=set(nums)
  3.     s=set(range(1,len(nums)+1))
  4.     return [sum(nums)-sum(sn),(s-sn).pop()]
复制代码

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2020-3-26 13:38:31 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-3-26 13:54 编辑
  1. class Solution:
  2.     def findErrorNums(self, nums: List[int]) -> List[int]:
  3.         length=len(nums)+1
  4.         temp=[0]*length
  5.         result=[]
  6.         for i in nums:
  7.             temp[i]+=1
  8.         for i in range(1,length):
  9.             if 2==temp[i]:
  10.                 twice=i
  11.             elif not temp[i]:
  12.                 lost=i
  13.         return [twice,lost]
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

发表于 2020-3-26 13:40:52 From FishC Mobile | 显示全部楼层
本帖最后由 flamezyy 于 2020-3-27 12:25 编辑
  1. def f359(nums):
  2.     for index in range(len(nums)-1):
  3.         if nums[index] == nums[index+1]:
  4.             dup = nums[index]
  5.             break
  6.     return([dup] + list(set(x for x in range(1, len(nums)+1)) - set(nums)))
复制代码

还是来简约一点的吧

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-3-26 13:50:03 | 显示全部楼层
  1. def fun359(lst):
  2.     result=[]
  3.     lst.sort()
  4.     for i in lst:
  5.         if lst.count(i)==2:
  6.             result.append(i)
  7.             break
  8.     k=set(range(1,lst[-1]+1))-set(lst)
  9.     result.append(k.pop())
  10.     return result
复制代码

麻烦版主把357,358题测一下吧

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-3-26 13:53:28 | 显示全部楼层
本帖最后由 BngThea 于 2020-3-28 13:48 编辑

可以用numpy吗
  1. import numpy as np

  2. def get_res(nums):
  3.     nums = np.array(nums)
  4.     org = np.arange(1,len(nums)+1)
  5.     ind = np.nonzero(nums-org)[0][0]
  6.     return [nums[ind],ind+1]
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-3-26 13:55:27 | 显示全部楼层

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

使用道具 举报

发表于 2020-3-26 13:56:09 | 显示全部楼层
fan1993423 发表于 2020-3-26 13:50
麻烦版主把357,358题测一下吧

版主最近挺忙的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 14:08:51 | 显示全部楼层
本帖最后由 March2615 于 2020-3-26 14:24 编辑
  1. def daily359(nums: list) -> list:
  2.     d = [0] * (len(nums) + 1)
  3.     a = b = 0
  4.     for i in nums:
  5.         d[i] += 1
  6.         if d[i] == 2:
  7.             a = i
  8.     for i in range(1, len(nums) + 1):
  9.         if d[i] == 0:
  10.             b = i
  11.             break
  12.     return [a, b]
复制代码


再来一种更容易想到的

  1. def daily359_2(nums: list) -> list:
  2.     prefect_sum = sum(range(len(nums) + 1))  # 理论上的总和
  3.     # prefect_sum = (n + 1) * n // 2
  4.     missing_sum = sum(set(nums))  # 缺少一个值(删去重复数字)的总和
  5.     missing_num = prefect_sum - missing_sum  # 缺少的数字
  6.     repeat_num = sum(nums) + missing_num - prefect_sum
  7.     return [repeat_num, missing_num]
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

发表于 2020-3-26 14:28:01 | 显示全部楼层
本帖最后由 塔利班 于 2020-3-26 14:29 编辑

nums是固定排好序且重复的是挨着的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 15:04:03 | 显示全部楼层    本楼为最佳答案   
  1. def f359(nums):
  2.     sn=set(nums)
  3.     s=set(range(1,len(nums)+1))
  4.     return [sum(nums)-sum(sn),(s-sn).pop()]
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

发表于 2020-3-26 16:23:31 | 显示全部楼层

def find_x_y(nums):
    lens = len(nums)
    x = 0
    for i in range(1, lens):
        if nums[i] == nums[i-1]:
            x = nums[i]
    sum_array1 = sum(nums)
    sum_array2 = (lens+1)*lens//2
    y = x - sum_array1 + sum_array2
    return x, y

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

 楼主| 发表于 2020-3-26 17:34:48 | 显示全部楼层
塔利班 发表于 2020-3-26 14:28
nums是固定排好序且重复的是挨着的?

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

使用道具 举报

 楼主| 发表于 2020-3-26 17:35:58 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 17:45:05 | 显示全部楼层
本帖最后由 TJBEST 于 2020-3-26 20:30 编辑

不知道sum的速度如何,如果sum比遍历更快,此法还是可以的。
结果应该不错,但是速度未知,纯数学思想没用到遍历。
  1. def fun359(nums):
  2.     M = len(nums)
  3.     S_standard = M*(M+1)//2
  4.     self_Sum = sum(nums)
  5.     delta_sum = self_Sum - S_standard
  6.     result = []
  7.     if delta_sum < 0:
  8.         head = 0
  9.         tail = M
  10.         while True:
  11.             Mid = (head+tail)//2
  12.             if sum(nums[:Mid]) == (1+Mid)*Mid//2:
  13.                 if nums[Mid] == Mid:
  14.                     result.append(Mid)
  15.                     break
  16.                 else:
  17.                     head = Mid
  18.             else:
  19.                 tail = Mid
  20.     else:
  21.         head = 0
  22.         tail = M
  23.         while True:
  24.             Mid = (head+tail)//2
  25.             if sum(nums[Mid:]) == (Mid + 1 + M)*(M - Mid)//2:
  26.                 if nums[Mid-1] == Mid+1:
  27.                     result.append(Mid+1)
  28.                     break
  29.                 else:
  30.                     tail = Mid
  31.             else:
  32.                 head = Mid
  33.     result.append(result[0] - delta_sum)
  34.     return result
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5

查看全部评分

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

使用道具 举报

发表于 2020-3-26 17:50:44 | 显示全部楼层
版主 输入 可能是 【1,1,2,4】还是片【1,2,1,4】,排好序了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 18:06:40 | 显示全部楼层

645题不是说给定的数组是无序的吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 18:43:24 | 显示全部楼层
  1. def myfun(arg):
  2.         list1 = []
  3.         for i in arg:
  4.                 if arg.count(i) > 1:
  5.                         list1.append(i)
  6.                         arg.pop(arg.index(i))
  7.         for i in range(2,len(arg)):
  8.                 if arg[i] != arg[i-1] + 1:
  9.                         list1.append(arg[i-1] + 1)
  10.                         break
  11.         return list1


  12. fun = myfun([1, 2, 3, 4, 5, 5, 7])
  13. print(fun)
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-3-26 19:52:21 | 显示全部楼层
  1. def solve(nums):
  2.     n = len(nums)
  3.     res =  [0, 0]
  4.     for i in range(1, n+1):
  5.         if nums.count(i) == 2:
  6.             res[0] = i
  7.         if nums.count(i) == 0:
  8.             res[1] = i
  9.     return res
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
zltzlt + 4 + 4

查看全部评分

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

使用道具 举报

发表于 2020-3-26 20:22:03 | 显示全部楼层
本帖最后由 sYMMetrY 于 2020-3-28 22:31 编辑
  1. def q359(num):
  2.     num.sort()
  3.     for each in range(1, len(num)+1):
  4.         if each != num[each-1]:
  5.             return([num[each-1],each])
复制代码
上面一段代码并未考虑周全,当重复数字与缺失数字不相连的情况,因此该进入下:
  1. num = [2,3,4,1,5,3]

  2. def q359(num):
  3.     num.sort()
  4.     for each in range(1, len(num)+1):
  5.         if each != num[each-1]:
  6.             if sum(num) - sum(range(1, len(num)+1)) > 0:
  7. #当原始列表中数字之和与未丢失数据的数字之和的差值大于0,则缺失数字必然小于等于重复数字,则此时出现不等式中的each为缺失数据,重复数字为缺失数字与差值(正)的和
  8.                 return([each + sum(num) - sum(range(1, len(num)+1)),each])
  9.             else:
  10. #当原始列表中数字之和与未丢失数据的数字之和的差值小于0,则缺失数字必然大于等于重复数字,则此时出现不等式中的each-1为重复数字,缺失数据为重复数字与差值(正)的和
  11.                 return([(each-1),(each -1) - (sum(num) - sum(range(1, len(num)+1)))])
  12. print(q359(num))
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

发表于 2020-3-26 21:21:15 | 显示全部楼层
nums = [1,1,3,4]
list1 = []
for i in range(len(nums)):
    if nums[i] == nums[i+1]:
        list1.append(nums[i])
        break
for i in range(1,len(nums)+1):
    if i != nums[i-1]:
        list1.append(i)
        break
print(list1)


小白~~你们代码格式是怎么回复的啊

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 20:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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