题目描述

一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。

思路:
解法一:
哈希表
class Solution
{
public:
void FindNumsAppearOnce(vector<int> data, int *num1, int *num2)
{
map<int, int> mapping;
for (int i = ; i < data.size(); i++)
mapping[data[i]]++;
vector<int> v;
for (int i = ; i < data.size(); i++)
{
if (mapping[data[i]] == )
v.push_back(data[i]);
}
*num1 = v[];
*num2 = v[];
}
};

解法二:

利用异或

1、异或思想,一个数与自己异或为0,一个数与0异或为自己
2、由于其它数字两两相同,所以所有数异或则得到这两个不同数的异或结果。取这个结果的第一个1作为标志位
3、这个标志的1,必须是:这两个数在该位一个为0,一个为1
4、这样可以将数组分为两组,一组在该标志位为1,一组在该标志位为0,这两个不同数字分别在这两组内
5、将两组内的数分别异或,得到两个结果则为这两个不同的数
class Solution
{
public:
void FindNumsAppearOnce(vector<int> data, int *num1, int *num2)
{
int tempbit = ;
for (auto c : data)
tempbit ^= c;
int sign = ; //记录两个数不同的那一位 for (; sign < data.size(); sign++)
{
if ((tempbit & ( << sign)) != )
break;
}
*num1 = ;
*num2 = ;
for (auto c : data)
{
if ((c & ( << sign)) == )
*num1 ^= c;
else
*num2 ^= c;
}
}
};
 

最新文章

  1. WebAPI 2参数绑定方法
  2. 2. web前端开发分享-css,js进阶篇
  3. SonarQube-5.6.3 代码分析平台搭建使用
  4. 自己利用jQuery实现的win8图标浮动更新
  5. CentOS 6.7 编译安装Nginx 1.8.0
  6. Unity3D NGUI制作的Button放到场景中,按钮从2D变到3D
  7. gets函数完美替代
  8. 安装TensorFlow的步骤
  9. Servlet中表单的重复提交
  10. zoj 3494:BCD Code
  11. 贼有意思[最长上升公共子序列](SAC大佬测试题)
  12. 服务器三:多线程epoll
  13. dgraph解决社交关系中的正反向查找
  14. python 05集合
  15. glide使用
  16. vs2015如何使用附加进程调试发布在IIS上项目
  17. [UE4]蓝图调试
  18. C# 线程 在 sleep,suspend 之后 Abort 的方法
  19. Mybatis输入输出映射
  20. Lora通讯

热门文章

  1. Delphi类与方法(几十篇)
  2. 用JavaScript刷LeetCode的正确姿势
  3. Redis 学习笔记(篇一):字符串和链表
  4. SpringBoot(十九)_spring.profiles.active=@profiles.active@ 的使用
  5. vue.js实现单选框、复选框和下拉框
  6. kubernetes实战篇之Dashboard的访问权限限制
  7. 如何两个月刷400道leetcode
  8. [Vue 牛刀小试]:第十四章 - 编程式导航与实现组件与 Vue Router 之间的解耦
  9. 【微信小程序】记录
  10. java中更新文件时,指定原文件的编码格式,防止编码格式不对,造成乱码