找唯一不出现三次而出现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;
}
找唯一不出现三次而出现1次的数子O(n)位运算算法的更多相关文章
- ZJU-199001 第三周练习 2 数字特征值 位运算算法
题目 对数字求特征值是常用的编码算法,奇偶特征是一种简单的特征值. 对于一个整数, 从个位开始对每一位数字编号, 个位是 \(1\) 号, 十位是 \(2\) 号, 以此类推. 这个整数在第位上的数字 ...
- 137 Single Number II(找唯一数Medium)
题目意思:一个int数组,有一个数只出现一次,其他数均出现三次,找到这个唯一数 思路: 1.将所有数用2进制表示,计算每一位的数字和 1*3*n1+0*3*n2+c 唯一数对应位的数字(0或者1 ...
- NYOJ528 找球号(三)位运算
找球号(三) 时间限制:2000 ms | 内存限制:3000 KB 难度:2 描述 xiaod现在正在某个球场负责网球的管理工作.为了方便管理,他把每个球都编了号,且每个编号的球的总个数都是 ...
- 找球号(三)南阳acm528(异或' ^ ')
找球号(三) 时间限制:2000 ms | 内存限制:10000 KB 难度:2 描述 xiaod现在正在某个球场负责网球的管理工作.为了方便管理,他把每个球都编了号,且每个编号的球的总个数都 ...
- nyoj_528_找球号(三)_201404152050
找球号(三) 时间限制:2000 ms | 内存限制:3000 KB 难度:2 描述 xiaod现在正在某个球场负责网球的管理工作.为了方便管理,他把每个球都编了号,且每个编号的球的总个数都是 ...
- nyoj528-找球号(三) 【位运算】
http://acm.nyist.net/JudgeOnline/problem.php?pid=528 找球号(三) 时间限制:2000 ms | 内存限制:3000 KB 难度:2 描述 ...
- nyoj--528--找球号(三)(位运算&&set)
找球号(三) 时间限制:2000 ms | 内存限制:3000 KB 难度:2 描述 xiaod现在正在某个球场负责网球的管理工作.为了方便管理,他把每个球都编了号,且每个编号的球的总个数都是偶数 ...
- 九度OJ 1256:找出两个只出现了一次的数字 (位运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:568 解决:186 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 输入的 ...
- java . 请在小于99999的正整数中找符合下列条件的数,它既是完全平方数,又有两位数字相同,如:144,676。
import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; //请在小于99999的正整数中找符合下列条件的 ...
随机推荐
- Android开源项目(一)
Android开源项目(一) GitHub在中国的火爆程度无需多~~,越来越多的开源项目迁移到GitHub平台上.更何况,基于不要重复造轮子的原则~~~~了解当下比较流行的Android与iOS开源项 ...
- HashMap和HashTable 学习
1. HashMap 1) hashmap的数据结构 Hashmap是一个数组和链表的结合体(在数据结构称“链表散列“),如下图示: 当我们往hashmap中put元素的时候,先根据key的hash ...
- Shot(三分)
Shot Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- Android4.3模拟器界面中右侧菜单按钮无法使用问题解决办法
开发环境:笔记本电脑Windows2008+MyEclipse 10+Android4.3 问题描述:运行或者调试Android项目时,发现模拟器中右侧Menu按钮无法点击,截图如下: 查看在Andr ...
- 如何判断一个变量是数组Array类型
在很多时候,我们都需要对一个变量进行数组类型的判断.JavaScript中如何判断一个变量是数组Array类型呢?我最近研究了一下,并分享给大家,希望能对大家有所帮助. JavaScript中检测对象 ...
- Extending your SharePoint 2007 site with Microsoft ASP.NET AJAX 3.5
After ASP.NET 3.5 has been installed you need to modify the web.config file of your MOSS web site wi ...
- SharePoint网站集功能介绍
SharePoint网站集功能介绍 https://support.office.com/zh-cn/article/%E5%90%AF%E7%94%A8%E6%88%96%E7%A6%81%E7%9 ...
- dialog组件的jquery封装实现
(function($){ $.extend({ Dialog : function(id, options){ var option = $.extend({}, options); option. ...
- codeforces 623A. Graph and String 构造
题目链接 给出一个图, 每个节点只有三种情况, a,b, c. a能和a, b连边, b能和a, b, c,连边, c能和b, c连边, 且无重边以及自环.给出初始的连边情况, 判断这个图是否满足条件 ...
- Android studio dabao
首先肯定是配置gradle,百度一下就知道了,我的是mac下配置的,sudo vim ~/.bash_profile ,然后设置环境变量 GRADE_HOME=/Users/Admin/gradle; ...