剑指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 ...
随机推荐
- Magic Points ZOJ - 4032
The 15th Zhejiang Provincial Collegiate Programming Contest Sponsored by TuSimple Magic Points ZOJ - ...
- 在centos7上使用packstack安装openstack
简介 Packstack主要是由Redhat推出的用于概念验证(PoC)环境快速部署的工具.Packstack是一个命令行工具,它使用Python封装了Puppet模块,通过SSH在服务器上部署Ope ...
- 下载安装Xocde并创建一个C语言的项目工程
安装好Xcode后,新建工程 选择command line tool 选择c语言 点击创建 可以设置运行平台版本 设置 设置c标准 去掉c++ 支持 打开编辑页面 运行 参考: https://www ...
- oracle insert into 多条数据
mysql : insert into tablename (column1,column2) values ('aa','bb'), ('dd','cc'), ('ee','ff'); oracle ...
- ROS Topic 常用指令
rostopic list rosnode list一樣,就是列出目前運行中的topic有哪些. rostopic echo <topic_name> 接下來這個指令比較重要啦,就是去監聽 ...
- 数据库安装后无法访问且mysql重启报错的解决方法
数据库安装后无法访问,mysql重启报错: 或报错:MySQL is running but PID file could not be found 解决方法: 第一种方法:看磁盘是否已满:df –h ...
- Android5.0以下drawable tag vector错误的解决办法(转发)
Android5.0以下drawable tag vector错误的解决办法 在Androi 5.0以下的设备可能会报这样的错误: Caused by: org.xmlpull.v1.XmlPullP ...
- 《maven实战》笔记(1)----maven的初识
刚入职公司用maven进行项目管理,于是昨天下午开始看<maven实战>的pdf,感觉很好,作者写的很有条理. 下面是笔记,看书做笔记还是很有必要的,加强自己的总结. 什么是maven? ...
- LSTM_Model
#!/usr/bin/python# -*- coding: utf-8 -*- import tensorflow as tf class TRNNConfig(object): "&qu ...
- Qt编写数据可视化大屏界面电子看板11-自定义控件
一.前言 说到自定义控件,我是感觉特别熟悉的几个字,本人亲自原创的自定义控件超过110个,都是来自各个行业的具体应用真实需求,而不是凭空捏造的,当然有几个小控件也有点凑数的嫌疑,在编写整个数据可视化大 ...