编程之美-----在一个整型数组里找出只出现过一次的那两个数

一、一个数组里除了一个数字之外,其他的数字都出现了两次

用异或来解

#include <iostream>
using namespace std;
int main()
{
    int T;
    int n,m;
    while(cin>>T,T){
        cin>>n;

        while(--T){
            cin>>m;
            n=m^n;
       }
        printf("%d\n",n);
    }
    return 0;
}

扩展:

一个整型数组里除了两个数字之外,其他的数字都出现了两次。

http://www.cnblogs.com/youxin/p/3349834.html

数据: 1 2 1 3 5 3 4 6 5 6

解法:

1、用上面那个方法从s [0]开始一直与每个数进行异或,最后得到 n=6,(110)2

2、要把这个数组分成两个分别只含一个数(2或4)的数组,然后就好办了

原数组分成了两个子数组,每个子数组都包含一个只出现一次的数字,而其他数字都出现了两次。因此到此为止,所有的问题我们都已经解决。

3、怎么分?由于这两个数是不一样的,所以这个异或结果包含了这两个数的特征。 把第一步异或的到的 n=6,(110)2 找到二进制位中为1的数分别做为一组。即:* 1* 和 10* 两组,那么就是分为:{ 3,3,2,6,6} 和 { 1,1,5,4,5}两组。怎么找?找到之后怎么分?

4、那么怎么处理才能进行分组呢?

//Test Case : int s[10]={1,2,1,3,5,3,4,6,5,6};
//函数功能 : 找出数组中两个只出现一次的数字
//函数参数 : arr为源数组,len为数组元素个数,result用来存放结果
//返回值 :   无
void FindIsolateTwo(int *arr, int len,int *result)
{
    //int len = sizeof(arr)/sizeof(arr[0]);
    result[0] = result[1] = 0;

    int i, all = 0, flag = 1;

    for(i = 0; i < len ; i++) //所有数异或
        all ^= arr[i];

    while(!(all&flag))  //寻找过滤位;(all&flag)非0就跳出
        flag <<= 1;

    for(i = 0; i < len; i++) //利用过滤位区分
    {
        if(flag&arr[i])
            result[0] ^= arr[i];
        else
            result[1] ^= arr[i];
    }
}

扩展2:

数组中有三个数只出现一次,其它的数恰好出现两次,找出这三个数

http://www.cppblog.com/flyinghearts/archive/2014/10/16/198695.html

时间: 2024-08-02 15:10:11

编程之美-----在一个整型数组里找出只出现过一次的那两个数的相关文章

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

曾经做过一道水题找出除了一个数字之外,其他数字都有2个.直接异或 最后结果就是那个数. 现在变成存在2个不一样的数字,假设成x,y,那么可以O(n)求出x^y,因为x,y不同,所以异或的结果不为0,看成2进制数,那么找到第一位为1 的位置,将这个位置设置为划分点,数组里所有这个位置为1 的异或一次,所有为0的再异或一次,最终求出的两个即为两个独特的数字. #include <stdio.h> #include <string.h> #include <algorithm>

在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。

题目:在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素.要求:(1)给出算法的基本设计思想.(2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释.(3)说明你所设计算法的时间复杂度和空间复杂度. (1)基本的设计思想: 一个数字出现的次数超过了长度的一半, 那么我们可以这样认为这个数字出现的个数一定大于其他全部数字出现的个数之和.算法的步骤如下: ①设数组为data[],数组长度为n,i=1.置currentAxi

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

package test; import java.util.*; public class test17 { public static void main(String[] args) { //一个整型数组里除了两个数字之外,其他的数字都出现了两次. // 请写程序找出这两个只出现一次的数字. int[] ints = {1,1,2,5,5,6,3,3}; Map<Integer, Integer> map = new HashMap<Integer, Integer>();

剑指Offer(Java版)第四十五题:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

/*一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. */ import java.util.*; public class Class45 { public void FindNumsAppearOnce(int[] array, int num1[], int num2[]){ ArrayList<Integer> list = new ArrayList<Integer>(); Arrays.sort(array); for(int

一个整型数组里除了一个或者两个或者三个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)

粗糙的给出了分析,最近比较累,以后会改进的. 题目中包括三个小的问题,由简单到复杂: 1,如果只有一个出现一次,考察到异或的性质,就是如果同一个数字和自己异或的活结果为零,那么循环遍历一遍数组,将数组中的元素全部做异或运算,那么出现两次的数字全部异或掉了,得到的结果就是只出现一次的那个数字. 2,如果有两个只出现一次的数字,设定为a,b.也是应用异或,但是数组元素全部异或的结果x=a^b,因为a,b是不相同的数字,因此x肯定不为0.对于x,从低位到高位开始,找到第一个bit位为1的位置设定为第m

Android jni 编程3(对基本类型一维整型数组的操作)总结版

主要学习资料:黑马程序员的NDK方法使用(生产类库so)              jni编程指南中文版(已上传至博客园) 博主文章(它使用的是VS和eclipse联合开发):http://www.cnblogs.com/activity-life/p/3643047.html //0.传入一维整型数组,无返回值(但已对数组进行了修改) public native void arrayEncode(int[] arr); //1.传入一维整型数组,数组长度(因为c不容易获取而Java方便),返回

复习一下整型数组,字符数组,整型指针数组,字符指针数组,整型数组指针,字符数组指针

20:52:01 2019-12-31 整型数组 int a[10];字符数组 char b[10]; _______________________整型指针数组 int *p[10]; |__|__|__|__|__|__|__|__|__| 每个格子里存的是一个指针,每个指针都是int类型的,会指向一个int的值. 1 for(int i=0; i<10; i++) 2 p[i] = &a[i]; //把a中的每个元素的地址都放在了指针数组p里. 3 4 for(int j=0; j&l

Java整型数组的最大长度到底有多长?

Java整型数组的最大长度到底有多长? 今天上网查了一下,各种说法都有,这个问题似乎总困扰我们Java初学者,无奈,只好自己试了一下,以下是我的测试代码,如果有错误,还望不吝赐教! 使用eclipse默认的vm arguments,运行以下代码: public static void main(String[] args) {byte[] array=new byte[61858764];// short[] shortArray=new short[30929382];// int[] int

不创建第三方变量对整型数组逆置

以整型数组为例实现逆置 将一个整型数组逆序,如:数组a[5]={1,2,3,4,5},逆序之后数组a的内容变成{5,4,3,2,1}. void SwapNum(int& a, int& b) {  a = a^b;  b = a^b;  a = a^b; } void SwapArray(int *str,int size) {  int i = 0;  for (i = 0; i < size / 2; i++)  {   SwapNum(str[i], str[size - i