#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)的更多相关文章

  1. 找出区间[A, B]内所有数字的奇数字位出现次数为偶数,偶数字位出现次数为计数的数的个数。(数位DP)

    题目:找出区间[A, B]内所有数字的奇数字位出现次数为偶数,偶数字位出现次数为计数的数的个数. 分析:这道题的状态同样不好取,因为要求每一个奇数的个数都要为偶数,每一个偶数的位数都要为奇数,又因为只 ...

  2. 消失的两个数字(1-N缺两个数)

    给定一个数组,包含从 1 到 N 所有的整数,但其中缺了两个数字.你能在 O(N) 时间内只用 O(1) 的空间找到它们吗? 以任意顺序返回这两个数字均可. 示例 1: 输入: [1]输出: [2,3 ...

  3. 一个数组中两个数的和为N,找出这两个数字的下标

    分析,两个数字的和为N.那么这两个数字是否是唯一的呢?输出的下标是否是第一对出现的呢? 1,我们假设这两个数字是唯一的 和是唯一的,那么其中一个数字越大,另一个数字就越小.想到大小关系,我们就想到了排 ...

  4. java_面试_01_一个月的面试总结(java)

    重点知识 由于我面试的JAVA开发工程师,针对于JAVA,需要理解的重点内容有: JVM内存管理机制和垃圾回收机制(基本每次面试都会问,一定要搞得透彻) JVM内存调优(了解是怎么回事,一般做项目过程 ...

  5. 用递归的方法求一个数组的前n项和

    用递归的方法求一个数组的前n项和 public class Demo1 { /* * 用递归的方法求一个数组的前n项和 */ public static void main(String[] args ...

  6. 面试题解:输入一个数A,找到大于A的一个最小数B,且B中不存在连续相等的两个数字

    玄魂工作室秘书 [玄魂工作室]      昨天发的算法有一处情况没考虑到,比如加一后有进位,导致又出现重复数字的情况,修正后今天重新发一次.     比如输入99,那B应该是101 因为100有两个连 ...

  7. 【剑指Offer学习】【面试题40:数组中仅仅出现一次的数字】

    题目:一个整型数组里除了两个数字之外.其它的数字都出现了两次,请敲代码找出这两个仅仅出现一次的数字. 要求时间复杂度是O(n),空间复杂度是O(1). 举例说明 比如输入数组{2, 4, 3, 6, ...

  8. 【剑指offer】面试题40:数组中只出现一次的数字

    题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路: 因为只有两个只出现一次的数字,所以所有数字进行异或之后得到值res一定不是0.这样,res ...

  9. 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字

    题目:给定一个长度为N的数组,其中每个元素的取值范围都是1到N.判断数组中是否有重复的数字.(原数组不必保留) 方法1.对数组进行排序(快速,堆),然后比较相邻的元素是否相同.时间复杂度为O(nlog ...

随机推荐

  1. delphi通过url下载文件

    procedure TfrmEngineerImport.btnDownloadClick(Sender: TObject);var vsql, SourceFile, DestFile, filen ...

  2. 十八、MySQL 数据排名查询某条数据是总数据的第几条

    ) as rowno )) b ORDER BY a.zjf DESC 注意:mysql的下标是从0开始的 参考文章: https://blog.csdn.net/warylee/article/de ...

  3. Linux网络编程二、tcp连接API

    一.服务端 1.创建套接字: int socket(int domain, int type, int protocol); domain:指定协议族,通常选用AF_INET. type:指定sock ...

  4. windows 安装多个版本的jdk后修改 环境变量不起作用

    本机已经安装了jdk1.6,而比较早期的项目需要依赖jdk1.5,于是同时在本机安装了jdk1.5和jdk1.6. 安装jdk1.5前,执行java -version得到java version &q ...

  5. JETSON TK1 ~ 安装Cuda和OpenCV3

    一:安装Cuda6.5 1:下载安装包 Cuda6.5 2.在TK1上安装软件包: cd ~/Downloads sudo dpkg -i cuda-repo-l4t-r21.3-6-5-prod_6 ...

  6. 8.1 HTML基础知识点

    8.1 HTML基础知识点 一.HTML是什么? Hyper Text Markup Language 超文本标记语言 的缩写 开发一个html文件,可以有很多方式 :比如Dreamweaver,HB ...

  7. 库&插件&框架&工具

    nodejs 入门 nodejs 入门教程,大家可以在 github 上提交错误 2016 年最好用的表单验证库 SMValidator.js 前端表单验证工具分享 浅谈前端线上部署与运维 说到前端部 ...

  8. Python代码整洁之道(一)

    很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名以及注释等一些内容的规范性,久而久之养成了一种习惯.对此呢,我特意收集了一些适合所有学习 Python 的人, ...

  9. 06.旋转数组的最小数字 Java

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...

  10. leetcode 207课程表

    class Solution { public: bool canFinish(int numCourses, vector<vector<int>>& prerequ ...