zltzlt 发表于 2020-3-26 13:27:16

Python:每日一题 359

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

今天的题目:

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

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

示例 1:

输入:nums =
输出:
示例 2:

输入:nums =
输出:
示例 3:

输入:nums =
输出:

{:10_298:}欢迎大家一起答题!{:10_298:}

永恒的蓝色梦想 发表于 2020-3-26 13:38:31

本帖最后由 永恒的蓝色梦想 于 2020-3-26 13:54 编辑

class Solution:
    def findErrorNums(self, nums: List) -> List:
      length=len(nums)+1
      temp=*length
      result=[]
      for i in nums:
            temp+=1
      for i in range(1,length):
            if 2==temp:
                twice=i
            elif not temp:
                lost=i
      return

flamezyy 发表于 2020-3-26 13:40:52

本帖最后由 flamezyy 于 2020-3-27 12:25 编辑

def f359(nums):
    for index in range(len(nums)-1):
      if nums == nums:
            dup = nums
            break
    return( + list(set(x for x in range(1, len(nums)+1)) - set(nums)))
还是来简约一点的吧

fan1993423 发表于 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题测一下吧

BngThea 发表于 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)
    return ,ind+1]

永恒的蓝色梦想 发表于 2020-3-26 13:55:27

BngThea 发表于 2020-3-26 13:53
可以用numpy吗

可以。

永恒的蓝色梦想 发表于 2020-3-26 13:56:09

fan1993423 发表于 2020-3-26 13:50
麻烦版主把357,358题测一下吧

版主最近挺忙的{:10_248:}

March2615 发表于 2020-3-26 14:08:51

本帖最后由 March2615 于 2020-3-26 14:24 编辑

def daily359(nums: list) -> list:
    d = * (len(nums) + 1)
    a = b = 0
    for i in nums:
      d += 1
      if d == 2:
            a = i
    for i in range(1, len(nums) + 1):
      if d == 0:
            b = i
            break
    return

再来一种更容易想到的

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

塔利班 发表于 2020-3-26 14:28:01

本帖最后由 塔利班 于 2020-3-26 14:29 编辑

nums是固定排好序且重复的是挨着的?

塔利班 发表于 2020-3-26 15:04:03

def f359(nums):
    sn=set(nums)
    s=set(range(1,len(nums)+1))
    return

旅途Z 发表于 2020-3-26 16:23:31


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

zltzlt 发表于 2020-3-26 17:34:48

塔利班 发表于 2020-3-26 14:28
nums是固定排好序且重复的是挨着的?

排过序的

zltzlt 发表于 2020-3-26 17:35:58

永恒的蓝色梦想 发表于 2020-3-26 13:38


228 ms

TJBEST 发表于 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:
                  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 + 1 + M)*(M - Mid)//2:
                if nums == Mid+1:
                  result.append(Mid+1)
                  break
                else:
                  tail = Mid
            else:
                head = Mid
    result.append(result - delta_sum)
    return result

TJBEST 发表于 2020-3-26 17:50:44

版主 输入 可能是 【1,1,2,4】还是片【1,2,1,4】,排好序了?

永恒的蓝色梦想 发表于 2020-3-26 18:06:40

zltzlt 发表于 2020-3-26 17:34
排过序的

645题不是说给定的数组是无序的吗?{:10_327:}

kejun0566 发表于 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 != arg + 1:
                        list1.append(arg + 1)
                        break
      return list1


fun = myfun()
print(fun)

Unicorn# 发表于 2020-3-26 19:52:21

def solve(nums):
    n = len(nums)
    res =
    for i in range(1, n+1):
      if nums.count(i) == 2:
            res = i
      if nums.count(i) == 0:
            res = i
    return res

sYMMetrY 发表于 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:
            return(,each])上面一段代码并未考虑周全,当重复数字与缺失数字不相连的情况,因此该进入下:
num =

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

chen971130 发表于 2020-3-26 21:21:15

nums =
list1 = []
for i in range(len(nums)):
    if nums == nums:
      list1.append(nums)
      break
for i in range(1,len(nums)+1):
    if i != nums:
      list1.append(i)
      break
print(list1)


小白~~你们代码格式是怎么回复的啊
页: [1] 2 3
查看完整版本: Python:每日一题 359