【Go】 找到所有数组中消失的数字 #数组 Easy

16 篇文章 2 订阅

给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。

找到所有在 [1, n] 范围之间没有出现在数组中的数字。

您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。

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



解法一:

一直都没找到解决方法。。看了其他人的思路才知道,哦,原来这么简单

把所有出现过的数字,它对应索引的值 -1 标记成负数, 如[ 1, 4, 3, 1 ] ⇒ [ -1, 4, -3, -1 ]
没有出现的数字自然就是正数,返回它对应索引 +1 的数字。

// package main

// import (
// 	"fmt"
// 	"math"
// )


func findDisappearedNumbers(nums []int) []int {
	c :=0
	for i :=0;i<len(nums);i++ {
		 n := int64(math.Abs(float64(nums[i]))-1)
		if nums[n] > 0 {
			nums[n] = -nums[n]
		}else{
			c++
		}
	}

	res := make([]int,c)	
	i :=0
	for key,value := range nums {
		if value > 0 {
			res[i] = key + 1
			i++
		}
	}

	return res
}


// func main() {
// 	nums :=[]int {1,1}
// 	fmt.Println(findDisappearedNumbers(nums))
// }

执行用时:1140 ms
已经战胜 53.85 % 的 golang 提交记录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值