欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

只出现一次的数字(Java语言)

程序员文章站 2022-03-02 11:45:42
原题链接136.只出现一次的数字给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?思想:方法1:利用位运算符比较强大利用异或运算法性质(1):0与任何数异或都得另外的那个数性质(2):1异或任何数=任何数取反性质(3):满足交换律和结合律1 xor 2 xor 3 xor 2 = (1 xor 1) xor (2 xor 2) xor 3 = 0 xor 0...

原题链接
136.只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

解题思路:

方法1:利用位运算符比较强大
利用异或运算法
性质(1):0与任何数异或都得另外的那个数
性质(2):1异或任何数=任何数取反
性质(3):满足交换律和结合律
1 xor 2 xor 3 xor 2 = (1 xor 1) xor (2 xor 2) xor 3 = 0 xor 0 xor 3 = 0 xor 3 = 3
性质(4):判断两个数是否相等可以用a异或b==0
性质(5):交换两个数可以
a=a异或b
b=b异或a
a=a异或b

方法2:
因为每个元素最多出现两次,可以利用set特性
当添加重复元素时,第二次会添加失败,说明set中已有相同元素,所以调用方法删除它
最后利用迭代器返回集合中第一个即为答案

代码:
方法1:

/**
 *作者:魏宝航
 *2020年11月25日,上午8:51
 */
class Solution {
    public int singleNumber(int[] nums) {
        int res=0;
        for(int i:nums){
            res^=i;
        }
        return res;
    }
}

方法2:

/**
 *作者:魏宝航
 *2020年11月25日,上午8:34
 */
class Solution {
    public int singleNumber(int[] nums) {
        Set<Integer> set=new HashSet<>();
        for(int i:nums){
            if(set.add(i)){

            }
            else{
                set.remove(i);
            }
        }
        return set.iterator().next();
    }
}

执行结果:

只出现一次的数字(Java语言)

本文地址:https://blog.csdn.net/m0_47256162/article/details/110109128