zoukankan      html  css  js  c++  java
  • 算法中:异或运算符

      例如:2^3。

      首先将2转为二进制 01

      3转为二进制 11

      它们进行比较:

      

     所以2^3=1

     备注:如果相同的数计算抑或,则为0

    有一道关于抑或的题:

      

     原来我是这么写的:

     1    /*O(n²)*/
     2     public int singleNumber1(int[] nums) {
     3         for (int i = 0; i < nums.length; i++) {
     4             // 是否重复
     5             boolean flag = false;
     6             for (int j = 0; j < nums.length; j++) {
     7                 if (i == j) {
     8                     continue;
     9                 }
    10                 if (nums[i] == nums[j]) {
    11                     flag = true;
    12                     break;
    13                 }
    14             }
    15             if (!flag) {
    16                 return nums[i];
    17             }
    18         }
    19         return -1;
    20     }

    但是后面发现很多人都用异或,异或中可以发现一个规律:

    1 System.out.println(4 ^ 1 ^ 2 ^ 2 ^ 1);// 4
    2 System.out.println(3 ^ 1 ^ 2 ^ 2 ^ 1);// 3
    3 System.out.println(1 ^ 2 ^ 2 ^ 1 ^ 5);// 5
    4 System.out.println(1 ^ 2 ^ 2 ^ 1 ^ 8);// 8

    如果运算中,满足这个规则,A^B^B,那么结果一定是没有成对出现的A,然后回看那道题。

    找出单独存在的元素,除开这个单独的元素,其他的元素都是成对出现的,所以可以使用异或来操作,代码如下:

    1  public int singleNumber2(int[] nums) {
    2         int result = 0;
    3         for (int i = 0; i < nums.length; i++) {
    4             result ^= nums[i];
    5         }
    6         return result;
    7 }
  • 相关阅读:
    [杂题]FZU2190 非提的救赎
    [模拟]ZOJ3480 Duck Typing
    [模拟]ZOJ3485 Identification Number
    [数论]ZOJ3593 One Person Game
    [博弈]ZOJ3591 Nim
    [杂题]URAL1822. Hugo II's War
    二分图相关
    KMP算法详解
    中国国家集训队论文集目录(1999-2009)
    最短路Dijkstra算法的一些扩展问题
  • 原文地址:https://www.cnblogs.com/daihang2366/p/12892257.html
Copyright © 2011-2022 走看看