题目:只出现一次的是数字
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
分析:本来想着利用一个额外的空间储存值进行判断,但是提示不使用额外空间,就想着两层循环来判断是否有重复的值,确实可以但是时间复杂度有点高,后来看了评论才知道考的是异或运算,确实有意思,二进制异或运算,所以一次循环,进行异或,最后的得到的就是只出现一次的数字,因为两个一样的数字异或得到的还是原数
代码:
func singleNumber(nums []int) int {
le:=len(nums)
res:=0
for i:=0;i<le;i++{
res ^=nums[i]
}
return res
}
题目:只出现一次的数字二
题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2]
输出: 3
分析:一下有点懵,怎么还有三次,我也不知道有什么运算三次运算后归0(其实有,只是我没想到),那算了想别的办法吧,既然题目说了只有一个,其他都是三个,那就把他排序一下,那么除了那一个其他都是三个连续一样,所以只需要找到谁跟后面那个不一样就好啦
代码:
func singleNumber(nums []int) int {
sort.Ints(nums)
n:=len(nums)
for i:=0;i<n-1;i++{
if nums[i]==nums[i+1]{
i=i+2
}else{
return nums[i]
}
}
return nums[n-1]
}
注意;go中对数组界限要求特别严格,不能出现越界情况,所以只能到n-2个,但是如果没找到说明肯定是最后一个了
题目:只出现一次的数字(三)
题目描述:给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]
分析;原理还是和二一样啦,一次循环,只不过需要判断一下切片中的数量,还要注意下别越界,看代码
代码:
func singleNumber(nums []int) []int {
sort.Ints(nums)
n:=len(nums)
res:=[]int{}
for i:=0;i<n-1;i++{
if nums[i]==nums[i+1]{
i=i+1
}else{
res=append(res,nums[i])
if len(res)==2{
return res
}
}
}
res=append(res,nums[n-1])
return res
}