剑指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 ...
随机推荐
- 2019.6.28 校内测试 T2 【音乐会】二重变革
看到这个题之后,一个很暴力很直接的想法就是贴上题目中的代码然后交上去走人,但是很显然这是会TLE+MLE的,想想谁会这么傻把主要代码给你QwQ~: 其实这段代码是想告诉你一件事:用序列中的大数减去小数 ...
- Python语法 - yield表达式(类似 m = yield i )
yield是个表达式而不仅仅是个语句,所以可以使用x = yield r 这样的语法, yield表达式可以接收send()发出的参数,yield表达式是跟send方法一起配合使用 send方 ...
- 创建createElement
let oDiv = { tag:'div', props:{ id:'box' } }: let oP = createElement('p',{'class':'list'},['周一']) ...
- linux后台运行nodejs项目
1.安装pm2,这里默认你已经安装了node.js和npm npm install pm2 -g 2.创建软连接 1)全局path路径 echo $PATH 2)pm2安装路径 安装pm2时,可看到p ...
- 黑马vue---28、vue中全局过滤器的基本使用
黑马vue---28.vue中全局过滤器的基本使用 一.总结 一句话总结: vue中的过滤器可以传递参数(根据参数来过滤),也可以用管道符拼接多个过滤器:例如<p>{{ msg | msg ...
- arcpy.UpdateCursor和arcpy.da.UpdateCursor计算面积时间的比较
arcpy.UpdateCursor ####################### import arcpy from arcpy import env import os import sys f ...
- jmeter-Charles抓包显示的请求方式错误了,难道
抓包显示的请求方式为get,但是get一直报错见上图 将get修改为post就正确了
- 以太坊Geth通过私钥导入新地址到钱包步骤
Open TextEdit Paste key into TextEdit without any extra characters or quotations Save the file as pk ...
- kotlin嵌套类
就是类中定义类 package loaderman.demo class Outer { var name: String = "name" inner class inner { ...
- kotlin创建类的实例
Java 中使用new关键字,但是在kotlin中调用函数和创建类的实例直接省略new 比如 new myClass()变成类myClass()