zoukankan      html  css  js  c++  java
  • [算法][LeetCode]Single Number——异或运算的巧妙运用

    题目要求

    Given an 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?

    一个int数组中,除了有一个int只出现了一次,其他int都出现了两次,请找出这个int。

    要求:设计的算法是线性的复杂度,并且不要用额外的内存空间。

    解题思路

    异或运算的几个相关公式:

    1. a ^ a = 0
    2. a ^ b = b ^ a
    3. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c
    4. d = a ^ b ^ c 可以推出 a = d ^ b ^ c
    5. a ^ b ^ a = b
     
    本题可以抽象成:int数组里有x1, x2 ... xn(每个出现2次),和y(只出现一次),得出y的值。
    由公式2可知,数组里面所有数异或的结果等于 x1^x1^x2^x2^...^xn^xn^y
    由公式3可知,上式等于(x1^x1)^(x2^x2)^...^(xn^xn)^y
    由公式1可知,上式等于(0)^(0)^...(0)^y = y
     
    因此只需要将所有数字异或,就可得到结果。

    Java代码

    public static int singleNumber(int[] A) {
        for (int i = 1; i < A.length; i++) {
            A[i] ^= A[i-1];
        }
        return A[A.length-1];
    }
  • 相关阅读:
    列举常见的关系型数据库和非关系型都有那些?
    web功能测试
    经典测试用例--水杯测试
    网络协议的比较
    做性能测试准备需知
    VMware虚拟机几个常用文件夹介绍
    网络协议-----session与cookie
    H5页面测试总结
    jmeter录制手机app脚本
    python requests库学习
  • 原文地址:https://www.cnblogs.com/hiddenfox/p/3397313.html
Copyright © 2011-2022 走看看