【LeetCode-Java实现】136. Single Number

题目描述

Given a non-empty array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:
Input: [2,2,1]
Output: 1

Example 2:
Input: [4,1,2,1,2]
Output: 4
找出数组中只出现一次的元素(其余皆出现两次),并返回该元素值。
(时间复杂度要求是线性的,且不开辟额外空间,即时间O(n),空间O(1))

解题思路

看到这题最直接的想法可能是对每个元素进行查找,看是否有重复,但这种方法时间复杂度肯定不是线性的。
一般看到这种时间和空间复杂度的要求,很有可能是巧用位运算了,底层二进制代码运算速度可不是盖的。

这一题是使用异或运算,为什么用这个呢?因为异或运算原理是:
a ^ a = 0
a ^ b =1 (a != b)
0 ^ a = a
异或还满足交换律: a ^ b = b ^ a

所以本题运算过程是
我们可以想象编译器把 相同的元素都交换到了一起进行异或计算,得到 0
假设数组共有n个元素(根据题意,n为奇数),相同的元素共 (n-1)/2 组,即 共有 (n-1)/2 个0,再不断异或,最终只有1个0
再把这个0和剩下的那个单个数进行异或,得到的就是这个单个数本身了

实现代码

根据上述思路可得Java代码:.

public int singleNumber(int[] nums) {
    	int res = nums[0];  //res用来存放每次异或的结果,初始值为数组第一个元素
        for (int i = 1; i < nums.length; i++)   {   //所以循环直接从数组第二个元素开始就行
            res = res ^ nums[i];  
            } 
        return res;  //返回的最终异或得结果即为单个数的值

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值