【力扣448-找到所有数组中消失的数字】多种解法(python3+golang)

题目描述

https://leetcode-cn.com/problems/find-all-numbers-disappeared-in-an-array/

思路题解

方法一:

python代码

class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        i=0
        #1. 遍历数组元素,对应的索引位置的元素作标记
        while i<len(nums):
            #由于数组的元素有可能已被*-1,所以取绝对值
            if abs(nums[i])-1<len(nums) and nums[abs(nums[i])-1]>0:
                nums[abs(nums[i])-1]*=-1
            i+=1
        i-=1
        #2. 寻找没有标记的索引位置
        while i>=0:
            if nums[i]<0:
                del nums[i]
            else:
                nums[i]=i+1
            i-=1
        return nums

在这里插入图片描述

go代码

func abs(x int)int{
    if x<0{
        return -x
    }
    return x
}
func findDisappearedNumbers(nums []int) []int {
    i:=0
    for ;i<len(nums);i++{
        if abs(nums[i])-1<len(nums) && nums[abs(nums[i])-1]>0{
            nums[abs(nums[i])-1]*=-1
        } 
    }
    i--
    for i>=0{
        if nums[i]<0{
            nums=append(nums[:i],nums[i+1:]...)
        }else{
            nums[i]=i+1
        }    
        i-=1
    } 
    return nums
}

在这里插入图片描述

方法二:

先遍历数组,当目前的元素不正确时,判断正确位置的那个元素是否是正确的,如果不正确,则与正确位置的那个元素交换,继续判断交换后的i位置的元素是否正确;如果正确,则退出循环,并i+1
最后原地去除正确的元素,原地修改不正确的元素,返回nums数组。

python代码

class Solution:
    def findDisappearedNumbers(self, nums: List[int]) -> List[int]:
        i=0
        while i <len(nums):
            while nums[i]!=i+1:#当目前的元素不正确时
                #判断正确位置的元素nums[nums[i]-1]是否已经正确
                if nums[i]-1<len(nums) and nums[i]!=nums[nums[i]-1]:
                    #交换
                    nums[nums[i]-1],nums[i]=nums[i],nums[nums[i]-1]
                else:
                    break
            i+=1
        i=len(nums)-1
        #原地去除正确的元素,原地修改不正确的元素
        while i>=0:
            if nums[i]==i+1:
                del nums[i]
            else:
                nums[i]=i+1
            i-=1
        return nums

在这里插入图片描述

go代码

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值