【数组中出现奇数次的2个数】 笔试题精选

转自:http://blog.csdn.net/wodewe/article/details/6863753#

题:有N+2个数,N个数出现了偶数次,2个数出现了奇数次(这两个数不相等),问用O(1)的空间复杂度,找出这两个数,不需要知道具体位置,只需要知道这两个值。
求解:如果只有一个数出现过奇数次,这个就比较好求解了,直接将数组中的元素进行异或,异或的结果
就是只出现过奇数次的那个数。
但是题目中有2个数出现了奇数次?,求解方法如下:
假设这两个数为a,b,将数组中所有元素异或结果x=a^b,判断x中位为1的位数(注:因为a!=b,所以x!=0,我们只需知道某一个位为1的位数k,例如0010 1100,我们可取k=2或者3,或者5),然后将x与数组中第k位为1的数进行异或,异或结果就是a,b中一个,然后用x异或,就可以求出另外一个。
为什么呢?因为x中第k位为1表示a或b中有一个数的第k位也为1,假设为a,我们将x与数组中第k位为1的数进行异或时,也即将x与a外加其他第k位为1的出现过偶数次的数进行异或,化简即为x与a异或,结果是b。

void getNum(int a[],int length)
{
    int s=0;//保存异或结果
    for(int i=0;i<length;i++)
    {
        s=s^a[i];
    }
   int temp1=s;//临时保存异或结果
   int temp2=s;//临时保存异或结果
    int k=0;
    while(!(temp1&1))//求位为1的位数
    {
        temp1=temp1>>1;
        k++;
    }
    for(int i=0;i<length;i++)
    {
        if((a[i]>>k)&1)//将s与数组中第k位为1的数异或
        {
            cout<<a[i]<<" ";
            s=s^a[i];
        }
    }
    cout<<s<<" "<<(s^temp2)<<endl;//(s^temp2)用来求另外一个数
} 
时间: 2024-10-10 08:34:24

【数组中出现奇数次的2个数】 笔试题精选的相关文章

调整数组中所有奇数位于偶数之前

题目:输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中 所有奇数全部位于前半数组,所有偶数全部位于后半数组. 题目分析: 一个整型数组中既有奇数又有偶数,欲使所有奇数全部位于前半数组,所有偶数全部位于后半数组, 那么我们不妨从前边查找偶数即arr[left]%2==0,如果不是偶数它将继续向后查找left+1,直到找到偶数,同时从后边 查找奇数即arr[left]%2==1,如果不是奇数它将继续向前查找right-1,将前边找到的奇数和后边找到偶数交换,的当两 个数组相遇时前边

[华为机试]求出数组中所有奇数之和以及所有偶数之和

代码: #include <iostream> #include <sstream> #include <fstream> #include <string> int main() { int num[100]; int odd = 0, even = 0; std::string str; getline(std::cin, str); std::stringstream s(str); int j = 0; while(getline(s, str, '

找出数组中出现奇数次的元素

题目1: 给定一个含有n个元素的整形数组,其中只有一个元素出现奇数次,找出这个元素 异或 题目2: 如果题目1中有两个数出现了奇数次,并且这两个数并不相等,如何在O(1)的复杂度内找出这两个数 假设这两个数为a,b 异或结果为x.问题是我们如何能够通过x得到a,b. 因为x不为0,所以x的二进制肯定有一位为1. 例如x的二进制为001001,那么我们只需要一个不为0的那个.k=1(或者k=4)意味着a或者b中有一个第k位位1,所以我们再到数组中寻找所有k=1位为1的所有数,并将他们和x进行异或.

数组中,奇数放前偶数放后

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 错误代码: public class Solution { public void reOrderArray(int [] array) { int len=array.length; for(int i=0;i<len;i++){ if((array[i]&1)==0){ int j; for(j=i;j<

1.2找数组中唯一成对的那个数

题目介绍 1-1000这1000个数放在含有1001个元素的数组中,只有唯一的一个元素重复,其它均只出现一次.每个数组元素只能访问一次,设计一个算法,将它找出来:不用辅助空间,能否实现? 题目解法 思路 题目的意思是有一个数组,里面的数字是唯一的1~1000,但是其中有两个数字重复,所以是1001的数组,假设这个重复的数字是K,用数(1~K~1000)^ 数组(1~K~K~1001)就得到 K. K^K=0,K^0=A 核心代码 int N=1001; int x1=0; //数(1~K~100

数组的循环右移问题(好未来笔试题)

问题描述:给定一个整数数组,长度为n,现在要求该数组循环右以m个元素. 例如,数组为{1,2,3,4,5,6,7,8,9},循环右移3个元素后为变成{7,8,9,1,2,3,4,5,6} 分析:这是我曾经参加好未来笔试时的一道编程题目,考完试后,总结了以下几种解法,给大家分享下. 解法一:辅助空间法,思路很简单,就是另外开辟一块和原来数组一样大小的空间.然后先把原来数组的最后面的m个元素复制到 新数组的前面,然后再把原来数组的前面的元素复制到新数组的后面,最后再把新数组的全部元素复制到原来的数组

算法题:将一个数组中所有奇数放前面和偶数放后面(不开辟新的内存空间)

package arithmetic; import java.util.Arrays; public class OddAndEven { public static void main(String[] args) { int [] a={5,10,26,32,41,7,9,8,4,12,1};; int low = 0; int high = a.length-1; /**想法: * 1.遍历.将奇数放在左边,偶数放在右边 * 2.先遍历左边,直到出现不是奇数的时候为止 * 3.再遍历右边

数组中出现一次的两个数(三个数)&amp; 求最后一位bit为1

对于两个数,对于结果中,剩余bit1来异或区分. 下面的解法,非常精简: int lastBitOf1(int number) { return number & ~(number - 1); } void getTwoUnique(vector<int>::iterator begin, vector<int>::iterator end, vector<int>& unique) { int xorResult = 0; for(vector<

数组中找出最小的K个数

题目 给出一个数组,找出K个最小的值 例如给出数组{5,2,4,3,1},给定K值3,则输出结果为{2,3,1} 程序 先给出第一个版本的程序 1 public static void printKNum(int[] source, int k) {//算法入口 2 if (k <= 0) { 3 System.out.println("请出入合法的K值"); 4 } else if (source.length <= k) {//如果数组的长度小于等于K,则全部输出 5