面试40-一个数组,有2个数字出现奇数次,其余都是偶数次,求这两个数字O(n) O(1)
#include<iostream>
using namespace std;
// 题目:数组中只有不多于两个数字出现次数是奇数次,其他都是偶数次,求出出现奇数次的数字(不含0的数组) //思想:
/*
(1)如果只有一个数字是奇数次,直接对数组进行按位异或运算,得到的结果就是该数
(2)如果有俩个,可以先对数组异或,得到的结果(就是两个奇数次的数字异或的结果),必定至少包含一个1,可以根据这个1在的位置,把数组分为两个部分
则两个奇数次的数字必定分别在两个部分,而相同的数次必定在同一组,则可以对两个部分分别求异或得到答案
*/
int findNumsAppear(int arr[],int len,pair<int,int>& st);// 返回0表示没有,1表示一个,2表示2个,-1表示参数错误,没有考虑更多的情况
int count1(int num);// 统计int在内存中1的个数
int main()
{
pair<int,int>st;
st.first=0x80000000;
st.second=0x80000000;
int arr[]={,,,,,,,,,,,,,,,,,,,,,,,,,};
cout<<findNumsAppear(arr,sizeof(arr)/sizeof(int),st)<<endl;
cout<<st.first<<" "<<st.second<<endl;
return ;
}
int findNumsAppear(int arr[],int len,pair<int,int>& st)
{
if(arr==NULL||len<=)
return -;
int num=arr[];
int count=;
for(int i=;i<len;i++)
num^=arr[i];
if(num==)
return ;
else // 找到num 中第一个1,让其他位置1为0 此处参考count1的方法
{
while(num)
{
if((num&(num-))==)
break;
else
num=num&(num-); // 最终会保留下最高位的一个1,用来划分数组
}
}
int i=;int j=len-;
int tmp;
while(i<j) // 循环最终结果为i==j 左半边数组的最后个元素下标
{
while(i<j&&(arr[j]&num)==)
j--;
while(i<j&&(arr[i]&num)==num)
i++;
if(i<j)
{
tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
int num1=arr[];
for(int k=;k<=i;k++)
num1^=arr[k]; int num2=arr[len-];
for(int k=len-;k>i;--k)
num2^=arr[k];
if(num1!=)
st.first=num1;
if(num2!=)
st.second=num2;
if(num1!=&&num2!=)
return ;
else return ;
}
int count1(int num) // 如果不许用位运算,直接 unsigned int n=(unsigned int)num; 用% / 计算 -1内存全部为FFFFFFFF 转为最大的unsigned int
{
int count=;
while(num)
{
++count;
num=num&(num-);
}
return count;
}
面试40-一个数组,有2个数字出现奇数次,其余都是偶数次,求这两个数字O(n) O(1)的更多相关文章
- 找出区间[A, B]内所有数字的奇数字位出现次数为偶数,偶数字位出现次数为计数的数的个数。(数位DP)
题目:找出区间[A, B]内所有数字的奇数字位出现次数为偶数,偶数字位出现次数为计数的数的个数. 分析:这道题的状态同样不好取,因为要求每一个奇数的个数都要为偶数,每一个偶数的位数都要为奇数,又因为只 ...
- 消失的两个数字(1-N缺两个数)
给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字.你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可. 示例 1: 输入: [1]输出: [2,3 ...
- 一个数组中两个数的和为N,找出这两个数字的下标
分析,两个数字的和为N.那么这两个数字是否是唯一的呢?输出的下标是否是第一对出现的呢? 1,我们假设这两个数字是唯一的 和是唯一的,那么其中一个数字越大,另一个数字就越小.想到大小关系,我们就想到了排 ...
- java_面试_01_一个月的面试总结(java)
重点知识 由于我面试的JAVA开发工程师,针对于JAVA,需要理解的重点内容有: JVM内存管理机制和垃圾回收机制(基本每次面试都会问,一定要搞得透彻) JVM内存调优(了解是怎么回事,一般做项目过程 ...
- 用递归的方法求一个数组的前n项和
用递归的方法求一个数组的前n项和 public class Demo1 { /* * 用递归的方法求一个数组的前n项和 */ public static void main(String[] args ...
- 面试题解:输入一个数A,找到大于A的一个最小数B,且B中不存在连续相等的两个数字
玄魂工作室秘书 [玄魂工作室] 昨天发的算法有一处情况没考虑到,比如加一后有进位,导致又出现重复数字的情况,修正后今天重新发一次. 比如输入99,那B应该是101 因为100有两个连 ...
- 【剑指Offer学习】【面试题40:数组中仅仅出现一次的数字】
题目:一个整型数组里除了两个数字之外.其它的数字都出现了两次,请敲代码找出这两个仅仅出现一次的数字. 要求时间复杂度是O(n),空间复杂度是O(1). 举例说明 比如输入数组{2, 4, 3, 6, ...
- 【剑指offer】面试题40:数组中只出现一次的数字
题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值res一定不是0.这样,res ...
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...
随机推荐
- HGOI 20191030am 题解
Problem A 腿部挂件 给出$n$个数的序列$a_i$,支持$T$次操作. 每次操作形如$x , l , r$,计算$\max_{i = l}^{r} (a_i \oplus x)$的值. 对于 ...
- 通过nginx转发,用外网连接阿里云的redis,报Unexpected end of stream的解决办法
一.在与redis同一个内网的服务器上A的nginx做了下面的设置 stream { upstream redis { server redis.rds.aliyuncs.com:6379 max_ ...
- HDU 1711:Number Sequence(KMP)
Number Sequence Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Centos安装成功后配置网络
一.设置IP地址.网关DNS 说明:CentOS 7.0默认安装好之后是没有自动开启网络连接的! cd /etc/sysconfig/network-scripts/ #进入网络配置文件目录 vi i ...
- Xpath中text(),string(),data()的区别
摘要: 在XPath中,经常使用text()和string(),而我一般都是想到哪个用哪个,究竟他们之间有什么不同,没有在意过. 本质区别 text()是一个node test,而string()是一 ...
- scrapy pipeline
pipeline的四个方法 @classmethod def from_crawler(cls, crawler): """ 初始化的时候,用以创建pipeline对象 ...
- win10无法连接windows服务器,无法连接SENS服务
本文链接:https://blog.csdn.net/weixin_38374974/article/details/80475566 膜拜大佬 首先,进入windows界面的时候,前期加载速度变得极 ...
- VNC连接Ubuntu 16.04桌面灰色的问题解决
1.安装gnome apt-get install --no-install-recommends ubuntu-desktop gnome-panel gnome-settings-daem ...
- LC 712. Minimum ASCII Delete Sum for Two Strings
Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...
- 如何在GitHub上下载一部分文件(单个文件夹)
Preface Github下的项目可能很大,里面有很多的子文件夹,我们可能只需要使用某个子目录下的资源,可以不用下载完整的repo就能使用. 例如,我想下载这个repo中的mnist_gan文件:h ...