zoukankan      html  css  js  c++  java
  • 一个整型数组里除了一个数字之外,其它的数字都出现了两次。请写程序找出这个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

    题目:一个整型数组里除了一个数字之外,其它的数字都出现了两次。请写程序找出这个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

    分析:由于题目要求时间复杂度为O(n),所以先排序然后比较相邻数字是否相同的思路被排除。

                空间复杂度是O(1),辅助空间被限制,所以hash表的思路也被排除。

               那么这个题的突破口在哪里呢?注意这个数组的特殊性:其它数字都出现了两次,只有一个数出现了一次。可以想到运用异或运算,任何一个数字异或它自己都等于0。

               如果我们从头到尾依次异或数组中的每一个数,那么最终的结果就是那个只出现一次的数字,因为其他出现两次的数字全部在异或中被抵消为0了(异或运算遵循交换分配率)。

               举个栗子:2  3  4  2  3

               所有数字依次异或运算:2 xor 3 xor 4 xor 2 xor 3 = (2 xor 2) xor (3 xor 3) xor 4= 0 xor 0 xor 4 = 4

              最终结果4就是我们要找的那个只出现一次的数字。

    void FindNumsAppearOnce(int data[], int length, int &num1)
    {
        if (length < 2)
            return;
        int resultExclusiveOR = 0;
        for (int i = 0; i < length; ++ i)
            resultExclusiveOR ^= data[i];
            num1=resultExclusiveOR ;
    }
  • 相关阅读:
    刷题笔记
    布隆过滤器
    单例模式,堆,BST,AVL树,红黑树
    B树、B-树、B+树、B*树【转】,mysql索引
    数据结构与算法80道
    海量数据处理【转】
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
    volcanol的工控博客
  • 原文地址:https://www.cnblogs.com/dshn/p/9577340.html
Copyright © 2011-2022 走看看