美文网首页Java
如何快速找出成对元素中单身的那个小可怜(异或算法)

如何快速找出成对元素中单身的那个小可怜(异或算法)

作者: firststep | 来源:发表于2019-08-06 16:17 被阅读1次

起因

前两天跟我大哥出去吃饭的时候,他说从京东辞职去瓜子了。立马让他给我讲一下都有什么面试题可以让我学习一下的。他就提到了异或算法。

问题

给你一堆数字,其中只有一个单身的,其他都是成对的。(先为这个单身的数字默默的默个哀),如何用最快的方法来找出这个孤单的数字。

解决方案

正常来说第一时间跑到脑子里面的就是开始双重for循环吧,这样肯定不会是面试官想要的答案。那么最合适的当然就是异或运算。另外一个朋友说的定义一个与数组中不会重复的值,开始与数组中的每个元素都做异或运算,最后得出的就是那个单身的元素。比如说就是[1,1,2,2,3], 给一个变量answer为0。1与0做异或运算为1,1与1为0,那么随后的就是3.我当时有点不太理解,如果不是按照你这样的顺序呢,就不对了呀。但是他说不会的,异或运算遵守着交换律,不管怎么样得出的都会是3。一直都没有理解,因为这个问题一直在脑子里转火锅吃的也没有很开心。等到家立马看一下异或运算到底是怎么一回事。

实验

public class Test {

    public static int FindSingleDog() {
        int[] arr = {1,2,3,4,5,1,2,3,4};
        int answer = 0;
        for (int i = 0; i<arr.length; i++) {
            answer = arr[i] ^ answer;
        }
        return answer;
    }
}

果不其然最后返回的就是5,但是我debug一步一步看的时候发现第二步1与2做异或运算的时候为3,我又懵逼了,为什么呢?又查找了一下资料,发现原来是使用转化为二进制来进行操作的,1则是0001,2则是0010,异或为0011.这不就是3了么。0001与0001做异或为0000不就变成0了。果然是还要先看一下这些运算的解释再进行试验会理解的快一点。哈哈哈,明天七夕提前拉拉自己单身狗的被子。

相关文章

  • 如何快速找出成对元素中单身的那个小可怜(异或算法)

    起因 前两天跟我大哥出去吃饭的时候,他说从京东辞职去瓜子了。立马让他给我讲一下都有什么面试题可以让我学习一下的。他...

  • 2020-12-18

    异或运算可以快速获得在这个序列只有一个出现次数为奇数元素,因为相同元素异或运算为0。 Java中,使用原始的 fi...

  • 排序算法

    常用排序算法总结(一)找出数组中出现次数最多的那个数——主元素问题 Arrays.sort() 对基本类型用快速排...

  • Single Number

    题目要求找出在算法的时间复杂度为线性时间,且不占据额外的内存 下面讲解算法:该算法主要用到了位运算中的异或运算^,...

  • golang实现快速排序

    快速排序算法的算法逻辑如下: 选取数组中的一个元素,将所有的比该元素小的元素放到该元素的左侧,比它大元素放到它的右...

  • 快速排序

    快速排序 快速排序算法的核心思想是: 在待排序序列中选择一个分割元素,将待排序序列中所有比分割元素关键字小或相等的...

  • 异或交换算法中的小坑

    突然想起来挺久前的一件事,因为太琐碎就不放到「深夜学算法」系列里了。 「交换两数」大概是编程入门者紧接着Hello...

  • 算法题:搜索两条单身狗

    技术群里有人提出一个算法题:一个Int型数组,里面的每一个数都是成双成对的,只有一个数是单身狗,找出这个数,算法复...

  • 异或 算法

    解读:网上的一段代码

  • LeetCode 389. Find the Differenc

    找出两个string中的单一值,使用异或操作,两个相同的值异或等于零,把两个string中的所有值都做异或操作,最...

网友评论

    本文标题:如何快速找出成对元素中单身的那个小可怜(异或算法)

    本文链接:https://www.haomeiwen.com/subject/bohwdctx.html