【数据结构与算法精炼】LeetCode No.136 : Single Number,由一道算法题想到的关于XOR运算的使用

·  阅读 96

引言

数据结构与算法,是程序员的内功修炼。甚至有开发者还提出了程序=数据结构+算法。
少侠我之前参加校招的时候,也是凭借在手撕代码环节出色的算法解题思路获得面试官的称赞并击败众多竞争者最后拿到字节跳动等大厂的offer。
为了保持算法心经的日臻纯熟,我暗下决心,决定开始写互联网数据结构与算法相关的文章,希望能帮助各位读者在以后的手撕代码中游刃有余,对面试官进行360°的反击,让一同面试的同僚瞠目结舌,疯狂收割互联网大厂offer!
文章中虽然应用了夸张的修辞手法,但我们应该始终保持一颗谦逊的心。希望和大家怀着虚怀若谷的心态,共同学习进步。

问题描述

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)且不能开辟额外的空间
读到这里,请各位读者发散思维考虑该怎么解答……
在这里插入图片描述
少侠这里给出自己的思路:异或运算(XOR)

那么什么是异或运算呢?

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

异或运算的几个规律

  • 两个相同的数异或结果为0,即X^X=0
  • 任何数与0相异或,保留原值 ,X ^ 00000000 = X。
  • 使特定位翻转找一个数,对应X要翻转的各位,该数的对应位为1,其余位为零,此数与X对应位异或即可。例:X=10101110,使X低4位翻转,用X ^0000 1111 = 1010 0001即可得到。
  • 将两数异或的结果与其中一数再进行异或,可以得到另一个数。
  • 一个数与另一个数异或两次是其本身

根据以上规律的前两个即可解决这道题,想想两个相同的数异或结果为0,所以采用异或运算的话,数组中所有相同的数异或后结果为0,此时再和唯一的那个只出现一次的数异或,返回该数,即是所求,思路是不是很简单呢?附源码:

class Solution {
    public int singleNumber(int[] nums) {
        int res=0;
        for(int i=0;i<nums.length;i++){
            res^=nums[i];
        }
        return res;
    }
}
复制代码

小结

XOR运算只是本题的一个解答思路,此运算在很多场景下都有应用。掌握好逻辑运算、位运算对开发、面试都有益无害。

在这里插入图片描述

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改