找唯一不出现三次而出现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;}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • java 取余 小数_Java小数取余问题求助「建议收藏」

    java 取余 小数_Java小数取余问题求助「建议收藏」2016-09-0101:19最佳答案楼上的全不明白楼主的意思,楼主要的是算法,不是程序你们懂吗!!!我只能说你们不懂什么叫真正的算法,你们只是计算机的傀儡,我看了你们回答非常生气,高校教出来的就是这种“人才”,连算法都不懂。还不如我一高中生。严重BS楼上的,尤其是说java语言的那位。我来告诉你这个问题用递推解决首先要你承认一个公式,我是习惯pascal语言的,c++怕写错,反正只是算法,你忍…

  • idea 集成svn_idea从svn拉代码

    idea 集成svn_idea从svn拉代码IDEA集成SVN代码管理常用功能

    2022年10月17日
  • Oracle sql调优(网络优化知识点)

    文章目录一、访问数据的方法1、直接访问数据1.1全表扫描1.2ROWID扫描2、访问索引2.1索引唯一扫描2.2索引范围扫描2.3索引全扫描2.4索引快速全扫描2.5索引跳跃式扫描拓展补充本博客介绍一下属于oracle优化器范畴的一些基础知识,访问数据的方法,分为直接访问数据的方法和访问索引的方法两种,然后有了这些基础知识后,可以参考学习我的另外一篇博客:Oracle优化器简介,对…

  • 抽象工厂模式与工厂方法模式有哪些不同_抽象工厂模式java代码

    抽象工厂模式与工厂方法模式有哪些不同_抽象工厂模式java代码Abstract Factory动机实例模式定义结构要点总结笔记动机在软件系统中,经常面临着”一系列相互依赖的对象“的创建工作;同时,由于需求的变化,往往存在更多系列对象的创建工作如果应对这种变换?如何绕过常规的对象创建方法(new),提供一种”封装机制“来避免客户程序和这种”多系列具体对象创建工作“的紧耦合?实例数据库连接的时候会有很多关联的对象,这些对象是一个整体朴素class EmployeeDAO{public: vector<EmployeeDAO> GetEm

  • php一句话木马中的@有什么用

    php一句话木马中的@有什么用<?php@eval($_POST[‘attack’])?>@表示后面即使执行错误,也不报错eval()函数表示括号内的语句字符串什么的全都当做代码执行$_POST[‘attack’]表示从页面中获得attack这个参数值只要攻击者满足这三条添加,就能实现入侵:(1)木马上传成功,未被杀;(2)知道木马的路径在哪;(3)上传的木马能正常运行。…

  • c++预编译头文件_VJVJ X27s 智能安卓手机

    c++预编译头文件_VJVJ X27s 智能安卓手机我们都知道,C++Builder编程是建立在VCL类库的基础上的。在程序中经常需要访问VCL对象的属性和方法。不幸的是,VCL类库并不保证其中对象的属性和方法是线程访问安全的(Thread_safe),访问VCL对象的属性或调用其方法可能会访问到不被别的线程所保护的内存区域而产生错误。因此,TThread对象提供了一个Synchronize方法,当需要在线程中访问VCL对象属性或调用方法时,通过Synchronize方法来访问属性或调用方法就能避免冲突,使各个线程之间协调而不会产生意外的错误。

发表回复

您的电子邮箱地址不会被公开。

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