鱼C论坛

 找回密码
 立即注册
查看: 3198|回复: 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
def f359(nums):
    sn=set(nums)
    s=set(range(1,len(nums)+1))
    return [sum(nums)-sum(sn),(s-sn).pop()]

本帖被以下淘专辑推荐:

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-26 13:40:52 From FishC Mobile | 显示全部楼层
本帖最后由 flamezyy 于 2020-3-27 12:25 编辑
def f359(nums):
    for index in range(len(nums)-1):
        if nums[index] == nums[index+1]:
            dup = nums[index]
            break
    return([dup] + list(set(x for x in range(1, len(nums)+1)) - set(nums)))
还是来简约一点的吧

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-26 13:50:03 | 显示全部楼层
def fun359(lst):
    result=[]
    lst.sort()
    for i in lst:
        if lst.count(i)==2:
            result.append(i)
            break
    k=set(range(1,lst[-1]+1))-set(lst)
    result.append(k.pop())
    return result
麻烦版主把357,358题测一下吧

评分

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

查看全部评分

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

使用道具 举报

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

可以用numpy吗
import numpy as np

def get_res(nums):
    nums = np.array(nums)
    org = np.arange(1,len(nums)+1)
    ind = np.nonzero(nums-org)[0][0]
    return [nums[ind],ind+1]

评分

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

查看全部评分

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

使用道具 举报

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

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

使用道具 举报

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

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

使用道具 举报

发表于 2020-3-26 14:08:51 | 显示全部楼层
本帖最后由 March2615 于 2020-3-26 14:24 编辑
def daily359(nums: list) -> list:
    d = [0] * (len(nums) + 1)
    a = b = 0
    for i in nums:
        d[i] += 1
        if d[i] == 2:
            a = i
    for i in range(1, len(nums) + 1):
        if d[i] == 0:
            b = i
            break
    return [a, b]

再来一种更容易想到的
def daily359_2(nums: list) -> list:
    prefect_sum = sum(range(len(nums) + 1))  # 理论上的总和
    # prefect_sum = (n + 1) * n // 2
    missing_sum = sum(set(nums))  # 缺少一个值(删去重复数字)的总和
    missing_num = prefect_sum - missing_sum  # 缺少的数字
    repeat_num = sum(nums) + missing_num - prefect_sum
    return [repeat_num, missing_num]

评分

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

查看全部评分

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

使用道具 举报

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

nums是固定排好序且重复的是挨着的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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

查看全部评分

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

使用道具 举报

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

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

使用道具 举报

 楼主| 发表于 2020-3-26 17:35:58 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不知道sum的速度如何,如果sum比遍历更快,此法还是可以的。
结果应该不错,但是速度未知,纯数学思想没用到遍历。
def fun359(nums):
    M = len(nums)
    S_standard = M*(M+1)//2
    self_Sum = sum(nums)
    delta_sum = self_Sum - S_standard
    result = []
    if delta_sum < 0:
        head = 0
        tail = M
        while True:
            Mid = (head+tail)//2
            if sum(nums[:Mid]) == (1+Mid)*Mid//2:
                if nums[Mid] == Mid:
                    result.append(Mid)
                    break
                else:
                    head = Mid
            else:
                tail = Mid
    else:
        head = 0
        tail = M
        while True:
            Mid = (head+tail)//2
            if sum(nums[Mid:]) == (Mid + 1 + M)*(M - Mid)//2:
                if nums[Mid-1] == Mid+1:
                    result.append(Mid+1)
                    break
                else:
                    tail = Mid
            else:
                head = Mid
    result.append(result[0] - delta_sum)
    return result

评分

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

查看全部评分

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

使用道具 举报

发表于 2020-3-26 17:50:44 | 显示全部楼层
版主 输入 可能是 【1,1,2,4】还是片【1,2,1,4】,排好序了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

645题不是说给定的数组是无序的吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


fun = myfun([1, 2, 3, 4, 5, 5, 7])
print(fun)

评分

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

查看全部评分

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

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

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

评分

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

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> 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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-26 17:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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