每日编程(十八)--leetcode刷题

题目:只出现一次的是数字

题目描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 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
}

猜你喜欢

转载自blog.csdn.net/LYue123/article/details/87636712