找唯一不出现三次而出现1次的数子O(n)位运算算法[通俗易懂]

找唯一不出现三次而出现1次的数子O(n)位运算算法

大家好,又见面了,我是全栈君。

之前两次那个是异或运算处理。这次以为也是类似。可是没想出来。

高富帅想出来了算法,转为bitset,然后加起来 同样的话 要么0+0+0 要么1+1+1,最后剩下的 能够通过%3 算出0 或1。思想是这样,

事实上也是bit运算。仅仅只是不是异或这样的一次运算O(1)这样的,可是因为输入是int数组,-2^31~2^31-1 所以用32bit就能够表示了。

之前遇到,过几次错误,包含分配存储空间的问题,正如fawks说的。用全局数组,是在全局区域,比栈空间大非常多。所以能够申请大数组,可是leetcode向来

不给数据范围的,只是从int也能够知道了,可是leetcode是class的,public成员貌似也是栈。结果出错。顺便说一下leetcode非常多WA都说成TLE。。

。还有其它的类型指定错误。

后来发现有个负数的问题,负数取模符号位是异或(-7/-4=1…..-3, -7/4=-1….-3, 7/-4=-1…..3, 7/4=1….3  因此也能够归纳出,商的符号是除数被除数异或,余数符号是被除数符号),于是这样数组就变成负数了,为了便于处理。都辩证。可是最后符号位怎么判呢? 事实上都当成数组处理,3m个1,3n个1 另一个0/1,
加起来取模照样把代表符号位的0 1取出来。

可是从报错问题来看,另一个-2^31出错了,后来想想是的, 符号位变1,然后后面变为10000 1+31个0 结果那个1都装不下了,于是他的补码是10000000,所以要专门处理。
这里实现了比較底层的。实现了补码。

处理好逻辑后提交。最终过了T T

时间复杂度 O(32n)=O(n),空间复杂度O(1) 

PS: 代码前面那些直接copy了圆神的代码:)

#include <map>
#include <set>
#include <queue>
#include <stack>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <string>
#include <algorithm>
#include <sstream>
#include <iomanip>
#define Min(a,b) (((a) < (b)) ?

(a) : (b))#define Max(a,b) (((a) > (b)) ? (a) : (b))#define read freopen("in.txt","r",stdin) #define write freopen("out.txt","w",stdout)using namespace std;//#define MAXBITNUM 32//#define MAXNUM 100000//int bitnumvec[MAXNUM][MAXBITNUM];int singleNumber(int A[], int n) { //vector<int*> vec; if(n==1) return A[0]; const int MAXBITNUM=32; //int bitnumvec[MAXNUM][MAXBITNUM]; int** bitnumvec=new int*[n]; for(int i=0;i<n;i++) bitnumvec[i]=new int[MAXBITNUM](); for(int i=0;i<n;i++) { int offset=MAXBITNUM-1; if(A[i]==-pow(2.0,31))//-2^31 { bitnumvec[i][0]=1;//, 10000000...000 } else//others { if(A[i]<0&&A[i]>-pow(2.0,31))//negative { bitnumvec[i][0]=1;//1 means negative, 0 means positve A[i]=-A[i]; } while(A[i]!=0) { bitnumvec[i][offset]=A[i]%2; //bitnum[offset]=A[i]%2; A[i]=A[i]/2; offset--; } } //reverse(vec.begin(),vec.end()); //vec.push_back(bitnum); } //memset(bitnum,0,sizeof(int)*MAXBITNUM); int bitnum[MAXBITNUM]; memset(bitnum,0,sizeof(int)*MAXBITNUM); int x=0; for(int i=0;i<MAXBITNUM;i++) { //if(i==MAXBITNUM-1) // int y=1; for(int j=0;j<n;j++) { //if(bitnumvec[j][0]==0) bitnum[i]+=bitnumvec[j][i]; //else if(bitnumvec[j][0]==1) // bitnum[i]-=bitnumvec[j][i]; } bitnum[i]=bitnum[i]%3; if(i>0) x+=bitnum[i]*pow(2.0,MAXBITNUM-1-i); } if(bitnum[0]==1 &&x !=0) x=-x; else if(bitnum[0]==1 && x==0) x=-pow(2.0,31); //for(int i=0;i<MAXBITNUM;i++) //int x; //for(int i=0;i<MAXBITNUM;i++) for(int i=0;i<n;i++) delete[] bitnumvec[i]; delete[] bitnumvec; return x;}int main(){ //int x=-3%2; int a[]={-2,-2,-2147483648,-2}; cout<<singleNumber(a,4)<<endl; return 0;}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116121.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python cv.imread_为什么cv2里没有imread

    python cv.imread_为什么cv2里没有imread为什么使用Python-OpenCV虽然python很强大,而且也有自己的图像处理库PIL,但是相对于OpenCV来讲,它还是弱小很多。跟很多开源软件一样OpenCV也提供了完善的python接口,非常便于调用。OpenCV的稳定版是2.4.8,最新版是3.0,包含了超过2500个算法和函数,几乎任何一个能想到的成熟算法都可以通过调用OpenCV的函数来实现,超级方便。一、需要工具本…

    2022年10月14日
    6
  • 鼠标捕获(setCapture,releaseCapture)的学习

    鼠标捕获(setCapture,releaseCapture)的学习鼠标捕获(setCapture)作用是将鼠标事件捕获到当前文档的指定的对象——对指定的对象设置鼠标捕获。这个对象会为当前应用程序或整个系统接收所有鼠标事件。所谓鼠标捕获,是指对鼠标事件(onmousedown,onmouseup,onmousemove,onclick,ondblclick,onmouseover,onmouseout)进行捕捉,使在容器内的子对象的鼠标事件均…

    2022年6月5日
    34
  • Idea激活码永久有效Idea2019.2.4激活码教程-持续更新,一步到位「建议收藏」

    Idea激活码永久有效Idea2019.2.4激活码教程-持续更新,一步到位「建议收藏」Idea激活码永久有效2019.2.4激活码教程-Windows版永久激活-持续更新,Idea激活码2019.2.4成功激活

    2022年6月17日
    108
  • pycharm django环境搭建_挣钱项目

    pycharm django环境搭建_挣钱项目2021/2/2pycharm打开的界面有更新。1.找到setting先找到自定义(customize)然后再点击Allsettings进入界面2.下载django的解释器先点击python的解释器(pythoninterpreter)然后选择一个需要配置django解释器的python项目,也可以新创一个。选择好python项目之后,可以从package栏查看下载了哪些python包。然后,点击pip,查找django就可以下载django的python包。THAT‘

    2022年8月27日
    5
  • 设备树 dtb结构

    设备树 dtb结构dtb 结构由一个小的报头和三个大小可变的部分组成 内存预留块 结构块和字符串块 这些应该按这个顺序出现在扁平的设备树中 因此 设备树结构作为一个整体 当以地址载入内存时 将类似于下图的图 较低的地址位于图的顶部 注 内存预留块可能不存在 尽管在某些情况下可能需要它们来满足单个块的对齐约束 自格式的原始定义以来 已经定义了几种扁平设备树结构的版本 报头中的字段给出了版本 以便客户端程序可以确定设备树是否以兼容的格式编码 本文档仅描述 17 版的格式 兼容 DTSpec 的引导程

    2025年6月22日
    4
  • endnote x9中文版安装教程(vivox9安装未知应用权限在哪)

    endnote x9中文版安装教程(vivox9安装未知应用权限在哪)一、下载在百度中搜索“Endnotex9”,点第一个链接进入下载页面。软件大小为108MB,下载的是一个压缩包,如下图所示,双击解压之后是右侧的图标,解压到文件夹,双击即可安装。二、安装直接安装即可,可以更换安装路径备注:安装成功后使用汉化版,可以将CHS文件夹里的[EndNote.exe]拷贝到EndNote的安装目录下。使用英文版,可以将ENG文件夹里的[EndNote.exe]拷贝到EndNote的安装目录下。不论用的是英文版还是中文版,替换之后即可使用…

    2022年4月18日
    197

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号