美文网首页
异或运算的应用,今日头条面试算法题

异或运算的应用,今日头条面试算法题

作者: 今年小学一年级 | 来源:发表于2018-08-13 01:19 被阅读0次

原题

  1~n放在含有n+1个元素的数组中,只有唯一的一个元素值重复,其它均只出现
一次。要求时间复杂度O(n),空间复杂度O(1)。

题解(Java)

public class Repeat {

  //利用求和作差求重复数
  public static int getRepeatNumber1(int[] arr) {
    if (arr == null) {
      return -1;
    } else {
      //数组的长度为n+1,求1~n的和
      int sum = 0;
      int n = arr.length - 1;
      if (n % 2 == 0) {
        sum = (n + 1) * (n / 2);
      } else {
        sum = (n + 1) * (n / 2) + (n / 2 + 1);
      }
      int sumArr = 0;
      for (int i = 0; i < arr.length; i++) {
        sumArr += arr[i];
      }
      return sumArr - sum;
    }
  }

  //利用异或求重复数
  public static int getRepeatNumber2(int[] arr) {
    if (arr == null) {
      return -1;
    } else {
      //数组的长度为n+1,求1~n的异或结果
      int orSum = 0;
      int n = arr.length - 1;
      //类似加法运算律,快速求1~n的异或结果
      if (n % 4 == 0) {
        orSum = n;
      } else if (n % 4 == 1) {
        orSum = 1;
      } else if (n % 4 == 2) {
        orSum = n + 1;
      } else {
        orSum = 0;
      }

      int orSumArr = 0;
      for (int i = 0; i < arr.length; i++) {
        orSumArr ^= arr[i];
      }
      return orSumArr ^ orSum;
    }
  }

  public static void main(String[] args) {
    int[] arr = {1, 2, 3, 3, 4};
    int result = getRepeatNumber2(arr);
    System.out.println(result);
  }
}

思考

   此题有两种解法。
  1. 求数组的和,然后求1~n的和,二者作差,结果即为重复数,比较巧妙的想法。看过网上的讨论后,有人说其实这题想考的是异或运算的应用,后来才出现了这种奇妙的解法。不知道出此题的人当初是不是这么想的,还是挺有意思的。在面试的过程中,一开始其实我并没找到空间复杂度O(1)的解法,面试官给出了提示,说可考虑用异或去做。从这方面也可以说明此题的本意可能是为了考察异或运算的应用吧。
  2. 关于异或运算的详细介绍,大家可以从网上查到。其主要的性质就是,两个相同的数异或结果为0,任何数异或0,结果为其本身,同时异或满足交换律和结合率。利用这几个性质就能解决此题。与解法1思路相同,首先求出1~n异或的结果,然后求出数组所有数字的异或结果,二者作异或运算,结果即为重复的数字。
  证明:
  记1~n异或结果为t1,重复的目标数字为k,那么数组的异或结果即为t1^k。二者异或结果为:t1^t1^k=k。

相关文章

  • 异或运算的应用,今日头条面试算法题

    原题   1~n放在含有n+1个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。要求时间复杂度O(n),...

  • 图像的加密和解密---OpenCV-Python开发指南(5)

    按位异或 要实现图像的加密与解密,我们首先需要掌握数学中的按位异或计算方式。 异或运算也叫半加运算,其运算法则与不...

  • 异或加密解密

    异或,英文为exclusive OR,或缩写成xor异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符...

  • 头条面试

    今天经历了一次十分不爽的面试,虽然之前没有面过今日头条,但是还是听说过头条面试喜欢问算法题。这次真的领略了。简单的...

  • 异或运算是什么,看看大白话怎么说

    异或运算是编程中常见的一种运算,用^或XOR表示,它的基本运算法则如下: true XOR true = fals...

  • 什么是异或_异或运算及异或运算的作用

    异或,是一个数学运算符,英文为exclusive OR,缩写为xor,应用于逻辑运算。异或的数学符号为“⊕”,计算...

  • 今日头条笔试面试大全

    整理了一下今日头条往届笔试面试题,希望对大家有帮助: 来源:今日头条笔试面试圈>> 1、2018今日头条校招算法方...

  • 同或、异或、位移、按位与、按位或运算

    同或运算 运算法则:相同为1,不同为0运算符号:⊙表达式:a⊙b=ab+a'b'(a'为非a,b'为非b); 异或...

  • Single Number

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

  • 位运算 算法

    位运算 算法 -1.与: &或: |非: !异或 : ^ 相同为 0, 不同为 1int 32 位 -> int ...

网友评论

      本文标题:异或运算的应用,今日头条面试算法题

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