LeetCode只出现一次的数字

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

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

示例 1:

  • 输入: [2,2,1]
  • 输出: 1

示例 2:

  • 输入: [4,1,2,1,2]
  • 输出: 4

10 11 01

想了很久不知道怎么写,搜了一下题解用异或运算就可以啦。

先介绍一下与、或、异或运算。

1. 与运算(&)

  • 参加运算的两个数据,按二进制位进行“与”运算。

  • 运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
    即:两位同时为“1”,结果才为“1”,否则为0

例如:3&5 即 0000 0011 & 0000 0101 = 0000 0001 因此,3&5的值得1。

例如:9&5 即 0000 1001 (9的二进制补码)&00000101 (5的二进制补码) =00000001 (1的二进制补码)可见9&5=1。

2. 或运算(|)

  • 参加运算的两个对象,按二进制位进行“或”运算。

  • 运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1;
    即 :参加运算的两个对象只要有一个为1,其值为1。

例如:3|5 即 0000 0011 | 0000 0101 = 0000 0111 因此,3|5的值得7。 

例如:9|5可写算式如下: 00001001|00000101 =00001101 (十进制为13)可见9|5=13

3. 异或运算(^)

  • 参加运算的两个数据,按二进制位进行“异或”运算。
  • 运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
    即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。

例如:9^5可写成算式如下: 00001001^00000101=00001100 (十进制为12)可见9^5=12

所以很容易就能想到用异或运算所有相同元素都会互相抵消,剩下一个“单身狗”元素了。

实现

golang 代码实现如下
top-interview-quesitons.go

\/**
  * Author: JeffreyBool
  * Date: 2019\/4\/12
  * Time: 22:39
  * Software: GoLand
*\/

package top_interview_quesitons

import (
    "fmt"
)

func SingleNumber(nums []int) int {
    ans := 0
    for _,num := range nums {
        fmt.Printf("ans: %d \n
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值