数组中只出现一次的问题(异或问题)
2017-08-10 20:53
169 查看
具体描述:
在一个整型数组中,数组都是成对出现,只有两个元素为单独的元素,求出这两个元素的值。
思路:
1、此处为异或预算符的经典问题,两个相同值的异或运算后的值为0;
2、首先将数组的所有元素做异或运算,最后得到的是两个单独元素异或后的值 (因为相同元素异或后的值均变成0);
3、两个单独元素肯定会有某一位或者几位是不同的,找出要么为0,要么为1,我们可以根据此位为0或者1,将数组元素分为两个部分,两个部分中,分别各有一个单独的元素,再做一会运算,则找到了这两个值。
代码描述
后记
该问题在做算法题目是看到,在此处做记录,以备日后查看学习。
在一个整型数组中,数组都是成对出现,只有两个元素为单独的元素,求出这两个元素的值。
思路:
1、此处为异或预算符的经典问题,两个相同值的异或运算后的值为0;
2、首先将数组的所有元素做异或运算,最后得到的是两个单独元素异或后的值 (因为相同元素异或后的值均变成0);
3、两个单独元素肯定会有某一位或者几位是不同的,找出要么为0,要么为1,我们可以根据此位为0或者1,将数组元素分为两个部分,两个部分中,分别各有一个单独的元素,再做一会运算,则找到了这两个值。
代码描述
#include <iostream> void FindNumsAppearOnce(int (&a)[6]) { //存放数组中所有元素异或后的值,相同值的异或为零,最后存放的是两个不同元素异或后的值 int value = 0; int num1,num2; //存放不同数组中不相同的值 int flag = 1; //根据flag的不同将数组元素分为两部分 for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++) { value ^= a[i]; } num1 = num2 = value; //异或后的值赋给两个元素作为初值 while ((value & flag) == 0) { flag <<= 1; //找到1,1就是单独两个元素不同的那一位 } for (int j = 0; j < sizeof(a) / sizeof(a[0]); j++) { if ((flag & a[j]) == 0) { num1 ^= a[j]; } else { num2 ^= a[j]; } } std::cout << "不重复的数组元素分别为:" << "\n" << "num1 = " <<num1 << " num2 = "<< num2; } int main(void) { int a[6] = { 2,4,5,2,5,6 }; FindNumsAppearOnce(a); getchar(); return 0; }
后记
该问题在做算法题目是看到,在此处做记录,以备日后查看学习。
相关文章推荐
- 百度面试题之找出数组中之出现一次的两个数(异或的巧妙应用)
- 码农小汪剑指Offer之38-数组中只出现一次的数字 异或运算的运用
- 剑指offer--数组中只出现一次的数字--异或运算、二进制运用
- 异或运算的经典算法题:找出数组中只出现一次的数字,其它数字都出现了两次
- 找出数组中两个只出现一次的数字--分组异或
- 数组中只出现一次的两个数(异或)
- 字符串问题---判断字符数组中是否所有的字符只出现了一次
- 异或的应用 及剑指offer 面试 40 数组中只出现一次的数字
- (经典的异或技巧)数组中只出现一次的数字 (两种方法)
- 数组中只出现一次的数字(异或方法)
- 寻找数组中丢失的、者重复的、或者出现一次的的数的问题汇总
- 面试题:找出数组中只出现一次的2个数(异或的巧妙应用)(出现3次)
- 关于面试常见的一个数组中找出出现一次的几个数字的问题
- 找出数组中两个只出现一次的数字;异或运算^的一个作用
- 数组中只出现一次的数字
- 数组中只出现一次的数字
- 40、数组中只出现一次的数字
- 剑指offer——面试题40:数组中只出现一次的数字
- 查找数组中只出现一次的元素
- 数组中的数只出现一次