剑指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 ...
随机推荐
- Django基础之ModelForm
1. form与model的终极结合 class BookForm(forms.ModelForm): class Meta: model = models.Book fields = "_ ...
- python常用模块介绍
关于if __name__ == "__main__": 若执行文件为bin,调用文件为cal: 若在执行文件bin中执行print(__name__) 输出:__main__ 当 ...
- JavaWeb_(SpringMVC框架)SpringMVC入门
Spring MVC又叫SpringWebMVC是一个轻量级的基于请求响应的表现层框架.它是Spring框架的一部分.SpringMVC与Struts2都可以替代原始Servlet技术. Spring ...
- pwn学习日记Day9 基础知识积累
知识杂项 libc是Linux下的ANSI C的函数库. LOOKUP函数 数组形式:公式为= LOOKUP(lookup_value,array) 式中 array-包含文本.数字或逻辑值的单元格区 ...
- 通过sqlserver用户操作远程服务器
USE masterGORECONFIGURE --先执行一次刷新,处理上次的配置GOEXEC sp_configure 'show advanced options',1 --启用xp_cmdshe ...
- Python 自学笔记(三)
1.列表 1-1.什么是列表 列表的代码格式:teacher=['张三','李四','王五'] 这里的['张三','李四','王五'] 就是一个列表,一个列表需要用中括号[ ]把里面的各种数据框起来, ...
- 错误Uncaught Error: Bootstrap's JavaScript requires jQuery at bootstrap.min.js:6 错误详解
引入Bootstrap的顺序进行修改 <% //获取以/开始,不以/结尾的部分 pageContext.setAttribute("APP_PATH", request.ge ...
- The first one spawns an additional process forwarding requests to a series of workers (think about it as a form of shield, at the same level of apache or nginx), while the second one sets workers to n
Things to know (best practices and “issues”) READ IT !!! — uWSGI 2.0 documentationhttps://uwsgi-docs ...
- LevelListDrawable
用来管理一组Drawable的,我们可以为里面的drawable设置不同的level, 当他们绘制的时候,会根据level属性值获取对应的drawable绘制到画布上,根节点 为:<level- ...
- Idea创建SpringBoot项目整合Hibernate
然后next 依赖包选择,Web必须 pom.xml: <?xml version="1.0" encoding="UTF-8"?> <pro ...