Leetcode Single Number II (面试题推荐)

举报
xindoo 发表于 2022/04/16 03:20:58 2022/04/16
【摘要】     还记得《剑指offer》和《编程之美》等书上多次出现的找一个数组中只出现一次的数那个题吗?     leetcode也有这道题 链接here  相信大家都知道用异或在O(n)的时间复杂度内求出的方法,这里不再赘述。 下面就是上题的升级版 Given an array of ...

    还记得《剑指offer》和《编程之美》等书上多次出现的找一个数组中只出现一次的数那个题吗?

    leetcode也有这道题 链接here  相信大家都知道用异或在O(n)的时间复杂度内求出的方法,这里不再赘述。

下面就是上题的升级版

Given an array of integers, every element appears three times except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

   给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。

   这样就不能使用异或的方法了,把所有元素以后得到的就是所有元素的异或值了,对我们没有任何帮助。

   这个问题依旧使用位运算来解决,不过更加复杂。

   我们用三个变量one two three,分别存储二进制未分别出现一次 两次 三次的位。


  
  1. class Solution {
  2. public:
  3. int singleNumber(int A[], int n) {
  4. int one = 0, two = 0, three = 0;
  5. for(int i = 0; i < n; i++)
  6. {
  7. three = two & A[i]; //出现三次的位肯定是由出现两次的得到的
  8. two = two | ones & A[i]; //出现两次的肯定是出现一次的得到的,不过还有原有的所以要或
  9. one = one | A[i]; //计算出现一次的位
  10. two = two & ~three; //去掉二进制中出现三次的位
  11. ones = one & ~three; //去掉二进制中出现三次的位</span>
  12. }
  13. return one; //最终twos three都为0,one就是我们要的答案
  14. }
  15. };


文章来源: xindoo.blog.csdn.net,作者:xindoo,版权归原作者所有,如需转载,请联系作者。

原文链接:xindoo.blog.csdn.net/article/details/38317285

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。