剑指offer40:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字
1 题目描述
2 思路和方法
(1)异或:除了有两个数字只出现了一次,其他数字都出现了两次。异或运算中,任何一个数字和自己本身异或都是0,任何一个数字和0异或都是本身。
(2)哈希表。unordered_map<int, int> map; for(int i = 0; i < data.size(); i++) map[data[i]]++;if(map[data[i]]== 1) v.push_back(data[i]); *num1 = v[0]; *num2 = v[1];
3 C++核心代码
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
//异或
if(data.size() < )
return;
int temp = data[];
for(int i = ;i < data.size();i++) //先求出全部数的异或结果
temp ^= data[i];
if(temp == ) //异或结果为0,说明没有两个只出现一次的不同的数字
return;
int index = ; //index为异或结果中1所在的最低位
while((temp&)==){
temp >>= ;
++index;
}
*num1 = *num2 =;
for(int i=;i<data.size();i++){
if((data[i]>>index)&) //表示每个数在标记index的地方为1
*num1 ^= data[i];
else //表示每个数在标记index的地方为0
*num2 ^= data[i];
}
}
};
https://blog.csdn.net/qq_21815981/article/details/79978909
class Solution {
public:
void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
//哈希表
unordered_map<int, int> map;
for(int i = ; i < data.size(); i++)
map[data[i]]++;
vector<int> v;
for(int i = ; i < data.size(); i++)
if(map[data[i]]== )
v.push_back(data[i]);
*num1 = v[];
*num2 = v[];
}
};
4 C++完整代码
#include<iostream> /*
返回num的最低位的1,其他各位都为0
*/
int FindFirstBit1(int num)
{
//二者与后得到的数,将num最右边的1保留下来,其他位的全部置为了0
return num & (-num);
} /*
判断data中特定的位是否为1,
这里的要判断的特定的位由res确定,
res中只有一位为1,其他位均为0,由FindFirstBit1函数返回,
而data中要判断的位便是res中这唯一的1所在的位
*/
bool IsBit1(int data, int res)
{
return ((data&res) == ) ? false : true;
} void FindNumsAppearOnce(int *arr, int len, int *num1, int *num2)
{
if (arr == NULL || len<)
return; int i;
int AllXOR = ;
//全部异或
for (i = ; i<len; i++)
AllXOR ^= arr[i]; int res = FindFirstBit1(AllXOR); *num1 = *num2 = ;
for (i = ; i<len; i++)
{
if (IsBit1(arr[i], res))
*num1 ^= arr[i];
else
*num2 ^= arr[i];
}
} int main()
{
static int arr[];
int n;
while (scanf("%d", &n) != EOF)
{
int i;
for (i = ; i<n; i++)
scanf("%d", arr + i); int num1, num2;
FindNumsAppearOnce(arr, n, &num1, &num2);
if (num1 < num2)
printf("%d %d\n", num1, num2);
else
printf("%d %d\n", num2, num1);
} system("pause");
return ;
}

https://blog.csdn.net/ns_code/article/details/27649027
#include<iostream>
#include<vector>
using namespace std;
void FindNumsAppearOnce(vector<int> data, int* num1, int *num2) {
if (data.empty())
return;
int num = ;
int len = data.size();
for (int i = ; i < len; ++i) {
num ^= data[i];
}
// 找到为1的位
int key = 0x1;
for (int i = ; i < len; ++i) {
if (key & num)
break;
key = key << ;
}
// 按照该位是否为1分成两组分别进行异或;最后结果分别为两个只出现一次的数
for (int i = ; i < len; ++i) {
if (data[i] & key)
*num1 ^= data[i];
else
*num2 ^= data[i];
}
}
int main()
{
vector<int> arr;
arr.push_back();
arr.push_back();
arr.push_back();
arr.push_back();
arr.push_back();
arr.push_back();
int num1 = ;
int num2 = ;
FindNumsAppearOnce(arr, &num1, &num2);
printf("%d %d\n", num1, num2);
system("pause");
return ;
}

参考资料
https://blog.csdn.net/qq_21815981/article/details/79978909
https://blog.csdn.net/ns_code/article/details/27649027
剑指offer40:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字的更多相关文章
- 一个整型数组里除了一个数字之外,其他的数字都出现了两次。要求时间复杂度是O(n),空间复杂度是O(1),如何找出数组中只出现一次的数字
思路分析:任何一个数字异或它自己都等于0,根据这一特性,如果从头到尾依次异或数组中的每一个数字,因为那些出现两次的数字全部在异或中抵消掉了,所以最终的结果刚好是那些只出现一次的数字. 代码如下: #i ...
- c# 计算一个整型数组的平均
一个整型数组的平均: class Program { static void Main(string[] args) { ,,,,,,,,,}; double avg= GetAvg(array); ...
- 剑指Offer-40.数组中只出现一次的数字(C++/Java)
题目: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 分析: 我们知道,两个相同的数字异或的结果等于0,所以利用这个性质将数组中所有的数字异或,求得的结 ...
- 求一个整型数字中有没有相同的部分,例如12386123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。方法是先将整型数字转换到数组中,再判断。函数为 int same(int num)其中num是输入的整型数字
import java.util.ArrayList; import java.util.List; import java.util.Scanner; public class Test { pub ...
- 刷题-力扣-剑指 Offer 42. 连续子数组的最大和
剑指 Offer 42. 连续子数组的最大和 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de ...
- 实验12:Problem H: 整型数组运算符重载
Home Web Board ProblemSet Standing Status Statistics Problem H: 整型数组运算符重载 Problem H: 整型数组运算符重载 Tim ...
- Java整型数组的最大长度到底有多长?
Java整型数组的最大长度到底有多长? 今天上网查了一下,各种说法都有,这个问题似乎总困扰我们Java初学者,无奈,只好自己试了一下,以下是我的测试代码,如果有错误,还望不吝赐教! 使用eclipse ...
- Android jni 编程4(对基本类型二维整型数组的操作)
Android jni 编程 对于整型二维数组操作: 类型一:传入二维整型数组,返回一个整型值 类型二:传入二维整型数组,返回一个二维整型数组 声明方法: private native int Sum ...
- Android jni 编程3(对基本类型一维整型数组的操作)总结版
主要学习资料:黑马程序员的NDK方法使用(生产类库so) jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.c ...
随机推荐
- MySQL数据分析(7)-SQL的两大学习框架
大家好,我是jacky,很高兴继续跟大家分享<MySQL数据分析实战>课程,前面的课程基本上我把MySQL的原理都做了一定的介绍,有好多朋友说学习MySQL是没有逻辑的,其实jacky是非 ...
- org.hibernate.TypeMismatchException: Provided id of the wrong type for class *** Expected ***
今天上生产发现warn日志有异常,就查看了下: 2018-12-05 10:05:05.666 [pool-4-thread-1] ERROR org.springframework.batch.co ...
- Linux设备驱动程序 之 工作队列
工作队列可以把工作推后,交给一个内核线程去执行–这个下半部分总是会在进程上下文中执行:通过工作队列执行的代码占尽进程上下文的优势:最重要的是工作队列允许重新调度甚至睡眠: 在工作队列和软中断/task ...
- IDEA配置Hadoop开发环境&编译运行WordCount程序
有关hadoop及java安装配置请见:https://www.cnblogs.com/lxc1910/p/11734477.html 1.新建Java project: 选择合适的jdk,如图所示: ...
- mysql索引分类
mysql索引分类 一.总结 一句话总结: 主键索引:设定为主键后数据库会自动建立索引,innodb为聚簇索引 单值索引:一个索引只包含单个列,一个表可以有多个单列索引:CREATE INDEX id ...
- redhat 7.6下如何更新YUM源(仓库)?
1. 安装epel-release yum install epel-release 2. 安装webstatic-release rpm -Uvh https://mirror.we ...
- 在CSS中定义【导航栏】超链接样式
1.案例css代码 <style> .divcss5 a:link{ color:#F00}/* 链接默认为红色 */ .divcss5 a:hover{ color:#000}/* 鼠标 ...
- Qt编写安防视频监控系统10-视频轮询
一.前言 视频轮询在视频监控系统中是一个基础的核心功能,尤其是上了大屏以后,这个功能是必须的,根据预先设定的轮询间隔逐个加载视频到预先设定的通道画面数中,轮询间隔.轮询画面数.轮询采用的码流类型(主码 ...
- SpringBoot: 17.热部署配置(转)
spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用. devtool ...
- DataFrame执行groupby聚合操作后,如何继续保持DataFrame对象而不变成Series对象
刚接触pandas不久,在处理特征时,碰到一个恶心的问题:用groupby聚合后,之前的dataframe对象变成了series对象,聚合的字段变成了索引index,导致获取这些字段时很麻烦,后面发现 ...