数组中只出现一次的数字

来源:互联网 发布:linux目录结构 编辑:程序博客网 时间:2024/06/02 06:39
一个整形数组里除了一个数字之外,其它数字都出现了两次,请写程序找出这一个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1).

如输入数组{-2,-4,-3,6,-3,-2,5,5,6} ,只有4出现了1次。


原理: 任何两个相同的数字异或的结果是0.


#include <stdio.h>#include <stdlib.h>int one_time_int(int array[],int len){    unsigned int i;    int result = 0;    for(i = 0 ; i < len; i++) {        result = result ^ array[i];         }    return result;}void main(int argc, char * argv[]){    int array[] = {-2,-4,-3,6,-3,-2,5,5,6};    int ret;    ret = one_time_int(array,sizeof(array)/sizeof(array[0]));    printf("the one time int is %d\n",ret);    return;}


运行结果:

[root@localhost c_language]# gcc -g one_time_int.c -o one_time_int[root@localhost c_language]# ./one_time_int the one time int is -4


将该题难度加大:

一个整形数组里除了2个数字之外,其它数字都出现了两次,请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1).

如输入数组{-2,-4,-3,6,-3,-2,5,5} ,只有-4和6都只出现了1次。


#include <stdio.h>#include <stdlib.h>int one_time_int(int array[],int len){    unsigned int i;    int result = 0;    for(i = 0 ; i < len; i++) {        result = result ^ array[i];         }    return result;}void main(int argc, char * argv[]){    int array[] = {-2,-4,-3,6,-3,-2,5,5};    int ret;    int ret1;    int i = 0;    int bit = 1;    int len;    len = sizeof(array)/sizeof(array[0]);    ret = one_time_int(array,sizeof(array)/sizeof(array[0]));        while(!(bit & ret)) {        bit = bit << 1;    }    printf("bit = 0x%x\n",bit);    ret = 0;    ret1 = 0;    for(i = 0 ;i < len; i++) {        if(bit & array[i]) {            ret = ret ^ array[i];        }else {            ret1 = ret1 ^ array[i];        }    }    printf("the one time int is %d,%d\n",ret,ret1);    return;}

[root@localhost c_language]# gcc -g one_time_two_int.c -o one_time_two_int
[root@localhost c_language]# ./one_time_two_int 
bit = 0x2
the one time int is 6,-4




0 0
原创粉丝点击