题解 | 数组中只出现一次的两个数字

数组中只出现一次的两个数字

https://www.nowcoder.com/practice/389fc1c3d3be4479a154f63f495abff8

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param nums int整型一维数组 
# @return int整型一维数组
#
class Solution:
    def FindNumsAppearOnce(self , nums: List[int]) -> List[int]:
        # write code here
        # 法1 独创垃圾:先排序,若与相邻的元素相同,则不是答案,并跳过相邻元素的验证,
        # 若不同,则就是答案,添加到answer中,直到rest=0
        #时间O(n) 空间O(1)
        # nums.sort() 
        # rest = 2  # 出现一次数字的个数
        # answer = list()
        # i = 0

        # while i < len(nums):
        #     if rest==2 and i==len(nums)-2:#剩下两个并且还缺两个
        #         answer.append(nums[i])
        #         answer.append(nums[i+1])
        #         return (answer)
                
        #     if i >= len(nums) - 1 and rest == 1:  # 就剩1个元素且答案还缺一个时候
        #         answer.append(nums[i])
        #         return(answer)
                
        #     if nums[i] == nums[i + 1]:  # 直接跳过相同数的判断
        #         i += 1

        #     elif nums[i] != nums[i + 1]: # 与相邻的不同就是答案
        #         answer.append(nums[i])
        #         rest -= 1
        #         if rest == 0:  # 没有了就返回答案
        #             return(answer)
        #     i += 1

        #法2:异或法
        res =[0, 0]
        temp= 0 
        #遍历数组,将所有元素异或
        #最后得到a^b
        for i in range(len(nums)):
            temp^=nums[i]
        
        k=1
        #找到两个数不相同的第一位(异或相同为0,不同为1)
        while k&temp==0:
            k<<=1
        
        #分类异或,最后保证剩余的是答案
        for i in range(len(nums)):
            if k & nums[i]==0: #nums[i]与k两数不相同的位置值相同,分为一类
                res[0]^=nums[i]
            else: 
                res[1]^=nums[i] #不同,分为1类
        
        res.sort()
        return res

全部评论

相关推荐

10-22 12:03
山东大学 Java
程序员小白条:26届一般都得有实习,项目可以随便写的,如果不是开源社区的项目,随便包装,技术栈也是一样,所以本质应该找学历厂,多投投央国企和银行,技术要求稍微低一点的,或者国企控股那种,纯互联网一般都得要干活
应届生简历当中,HR最关...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务