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

高富帅想出来了算法,转为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;
}

找唯一不出现三次而出现1次的数子O(n)位运算算法的更多相关文章

  1. ZJU-199001 第三周练习 2 数字特征值 位运算算法

    题目 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值. 对于一个整数, 从个位开始对每一位数字编号, 个位是 \(1\) 号, 十位是 \(2\) 号, 以此类推. 这个整数在第位上的数字 ...

  2. 137 Single Number II(找唯一数Medium)

    题目意思:一个int数组,有一个数只出现一次,其他数均出现三次,找到这个唯一数 思路: 1.将所有数用2进制表示,计算每一位的数字和  1*3*n1+0*3*n2+c   唯一数对应位的数字(0或者1 ...

  3. NYOJ528 找球号(三)位运算

    找球号(三) 时间限制:2000 ms  |  内存限制:3000 KB 难度:2   描述 xiaod现在正在某个球场负责网球的管理工作.为了方便管理,他把每个球都编了号,且每个编号的球的总个数都是 ...

  4. 找球号(三)南阳acm528(异或' ^ ')

    找球号(三) 时间限制:2000 ms  |  内存限制:10000 KB 难度:2   描述 xiaod现在正在某个球场负责网球的管理工作.为了方便管理,他把每个球都编了号,且每个编号的球的总个数都 ...

  5. nyoj_528_找球号(三)_201404152050

    找球号(三) 时间限制:2000 ms  |  内存限制:3000 KB 难度:2   描述 xiaod现在正在某个球场负责网球的管理工作.为了方便管理,他把每个球都编了号,且每个编号的球的总个数都是 ...

  6. nyoj528-找球号(三) 【位运算】

    http://acm.nyist.net/JudgeOnline/problem.php?pid=528 找球号(三) 时间限制:2000 ms  |  内存限制:3000 KB 难度:2   描述 ...

  7. nyoj--528--找球号(三)(位运算&&set)

    找球号(三) 时间限制:2000 ms  |  内存限制:3000 KB 难度:2 描述 xiaod现在正在某个球场负责网球的管理工作.为了方便管理,他把每个球都编了号,且每个编号的球的总个数都是偶数 ...

  8. 九度OJ 1256:找出两个只出现了一次的数字 (位运算)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:568 解决:186 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 输入的 ...

  9. java . 请在小于99999的正整数中找符合下列条件的数,它既是完全平方数,又有两位数字相同,如:144,676。

    import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; //请在小于99999的正整数中找符合下列条件的 ...

随机推荐

  1. Jsp、Servlet

    1 forward.redirect forward 转发是服务器行为,浏览器根本不知道服务器发送的内容是从哪儿来,所以它的地址栏中还是原来的地址. redirect 重定向是客户端行为.redire ...

  2. java学习之即时通信项目实战

     项目总结:这次项目主要是根据视频来的,结果跟到一半感觉跟不上,慢慢自己有了自己的想法,决定自己先不看学习视频,自己先试着写. 总结写前面,算是写的第一个项目吧.项目中遇到几点问题,首先Scoket对 ...

  3. poj 3264 Balanced Lineup(线段树、RMQ)

    题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...

  4. GDB命令行最基本操作

    程序启动: A.冷启动 gdb program              e.g., gdb ./cs gdb –p pid                 e.g., gdb –p `pidof c ...

  5. backbone HTTP方法中 options参数

    wait: 可以指定是否等待服务端的返回结果再更新model.默认情况下不等待url: 可以覆盖掉backbone默认使用的url格式attrs: 可以指定保存到服务端的字段有哪些,配合options ...

  6. Struts2项目中使用Ajax报错

    在Struts2项目中使用Ajax向后台请求数据,当添加了json-lib-2.3-jdk15.jar和struts2-json-plugin-2.3.4.1.jar两个包时,在result中配置ty ...

  7. windows上的tomcat配置

    下载及安装 首先要安装JDK:jdk-7windows-x64.zip 再安装tomcat:apache-tomcat-7.0.23-windows-x64.zip   配置环境变量: CATALIN ...

  8. Java中常见的几种类型转换

    public class Main { public static void main(String[] args){ //Int型数字转换成字符串 int num1=123456; //方法1 St ...

  9. 条款05:了解C++默默编写并调用哪些函数

    每一个class都会有一个或多个构造函数.一个析构函数.一个copy assignment操作符.这些控制着基础操作,像是产出新对象并确保它被初始化.摆脱旧对象并确保它被适当清理.以及赋予对象新值. ...

  10. 转: RequireJS Optimizer 的使用和配置方法

    RequireJS Optimizer 是 RequireJS 自带的前端优化工具,可以对 RequireJS 项目中的JavaScript和CSS 代码使用 UglifyJS 或者 Closure ...