剑指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 ...
随机推荐
- Subsequence (POJ - 3061)(尺取思想)
Problem A sequence of N positive integers (10 < N < 100 000), each of them less than or equal ...
- House Lawn Kattis - houselawn
Problem You have just bought a new house, and it has a huge, beautiful lawn. A lawn that needs cutti ...
- 【CF589 E】Another Filling the Grid
一个很套路的容斥裸题,这里记录一下scb 的切题过程 Description 有一个 \(n\times n\) 的矩阵,你需要往每格里填一个 \([1,k]\) 的整数,使得每一行.每一列的最小值都 ...
- flask + nginx + uwsgi + ubuntu18.04部署python restful接口
目录 参考链接 效果展示 一.准备工作 1.1 可运行的python demo: 1.2 更新系统环境 二.创建python虚拟环境 三.设置flask应用程序 四.配置uWSGI 五.设置系统启动 ...
- Robot Framework(十九) 附录
6附录 6.1测试数据中的所有可用设置 6.1.1设置表 Setting表用于导入测试库,资源文件和变量文件,以及定义测试套件和测试用例的元数据.它可以包含在测试用例文件和资源文件中.请注意,在资源文 ...
- Cesium学习系列汇总
内容比较多,完整看完需要大概10分钟,废话不多说,撸起袖子,加油干!!! 1.前言 按照套路,先介绍一下什么是Cesium. Cesium ['siːzɪəm]是JavaScript开源库,通过Ces ...
- 组件 computed 与 vuex 中 getters 的使用,及 mapGetters 的使用,对象上追加属性,合并对象
vue 是响应式的数据,这一点相当的方便我们的操作,但有些错误的操作方法会 vue 的响应无效 除此之外我们还要了解 vue.set() 和 Object.assgin() 的使用 vue.set() ...
- SQL-W3School-基础:SQL SELECT 语句
ylbtech-SQL-W3School-基础:SQL SELECT 语句 1.返回顶部 1. 本章讲解 SELECT 和 SELECT * 语句. SQL SELECT 语句 SELECT 语句用于 ...
- 浅谈smarty模板的mvc框架
最近接触了一个大项目,php做的后台管理,融合了smarty模板+mvc框架+phpcms内容管理,,,这个项目简直就是php的精华,于是小编大哥对项目小女子产生了兴趣,打算一点一点把她征服.现在小吃 ...
- 下了个pkg包的jenkins,的使用方法
三.如何启动Jenkins1.最简单的方法是双击Jenkins的pkg包,一步一步点同意,默认8080端口2.使用命令行启动打开terminal,进入到war包所在目录,执行命令: java -jar ...