• 常用算法之8---找到数组中只出现一次的数字


    题目:一个数组中的元素,只有一个数字出现了一次,其他的元素都出现两次。找出出现一次的这个数字。

    示例: {1,2,1,3,2,4,4}
    输出:3

    方案1:先将数组进行排序,这个数字一定是出现在第奇数位上(从1开始计数),并且这个数和后面的数不相同。
              若没有找到这个数字,则其为排序后的最后一个数字。
    分析:进行排序的时间复杂度O(nlogn),再遍历一遍为O(n),则总体时间复杂度为O(nlogn)。

    方案2*:若数组中不含有0和1,可令sum= a[0]*a[1]*...*a[n-1]。
              然后再遍历一遍数组,看a[i]是否能整除sum两次,若不能,即为所求。
    分析:为求得sum,需要遍历一次数组,O(n)。然后又要验证一遍,O(n)。
             综上,总的时间复杂度为O(n)。

    方案3:根据异或的特性:相同两数异或为0,不同两数异或为1。
              将所有的数进行异或操作,则最终的结果即为所求。
    代码:

    for(int i =1;i<a.length;i++)
        a[0] ^= a[i];
    print(a[0]);

    分析:仅遍历一遍,故时间复杂度为O(n)。

    建议:自己使用一个示例,使用上述方法自己演示一下,加深了解。

    扩展:若是有个数组,其中只有一个数N出现奇数次,其他的数都出现偶数次,怎样找到N?

  • 相关阅读:
    【UVa#10325】The Lottery
    【洛谷P1868】饥饿的奶牛
    【NOI2005】维护数列
    【NOIP2018】保卫王国
    【洛谷P4719】动态dp
    【NOI2014】魔法森林
    【洛谷P4234】最小差值生成树
    【国家集训队】Tree II
    面试1
    struts2中的方法的调用
  • 原文地址:https://www.cnblogs.com/xiaoChongUp/p/3324908.html
Copyright © 2020-2023  润新知