一组数中,只有两个数只出现了奇数次,其他所有数都是成对出现的,请找出那两个数
来源:互联网 发布:易语言外网聊天室源码 编辑:程序博客网 时间:2024/05/16 18:55
先看一个简单的,一组数中,只有一个数只出现了奇次,其他所有数都是成对出现的,找出出现奇次数的数。对于这个题,我们只需对所有数及逆行异或即可。理论公式:
a⊕b=b⊕a
a⊕0=a
a⊕b⊕b=a
a⊕(b⊕c)=(a⊕b)⊕c
代码:
#include <stdio.h>#include <stdlib.h>int main(){int arr[] = { 1, 2, 3, 4, 1, 2, 3 };int ret = 0;int len = sizeof(arr) / sizeof(arr[0]);for (int i = 0; i < len; i++){ret ^= arr[i];}printf("出现奇数次的数为:> %d\n", ret);system("pause");return 0;}
现看比较难的,一组数中,只有两个数只出现了奇次,其他所有数都是成对出现的,找出出现奇次数的数。通过上面的简单的例子,我们可以知道,只要我们把两个分开,分为两组数,再分别利用异或,就可以得那两个数。
现在我们看如何将一组数分为每一组数都只有一个数出现过一次的两组数:首先我们对所有数进行异或,那么得到的就是两个出现奇次的那两个数的异或,比如{ 1, 2, 3, 4, 1, 2, 7, 3 },就得到7⊕4,这个数肯定不为0,我们找出这个数的二进制数的最右边的1(设最右边的1在第inter位),然后找出数组的每个元素的第inter位,并判断此位是1还是0,是1的为一组,是0的为一组,这样就分好了组,再利用上面的例子,就可得到出现奇数次的那两个数。
#include <stdio.h>#include <stdlib.h>int main(){int arr[] = { 1, 2, 3, 4, 1, 2, 7, 3 };int len = sizeof(arr) / sizeof(arr[0]);int ret = 0;int inter = 0;int retA = 0;int retB = 0;for (int i = 0; i < len; i++){ret ^= arr[i];}/*找ret最右边的1*/inter = ret - (ret&(ret - 1));for (int i = 0; i < len; i++){int a = (arr[i] >> (inter - 1)) % 2; //取出arr[i]的第inter位if (a == 0){retA ^= arr[i];}else{retB ^= arr[i];}}printf("出现奇数次的两个数为:> %d,%d\n", retA, retB);system("pause");return 0;}
0 0
- 一组数中,只有两个数只出现了奇数次,其他所有数都是成对出现的,请找出那两个数
- 给一组数,只有两个数只出现了一次,其他所有数都是成对出现的。怎么找出这两个数。
- 给一组数,只有两个数只出现了一次,其他所有数都是成对出现的。怎么找出这两个数
- 【经典面试题】给一组数,只有两个数只出现了一次,其他所有数都是成对出现的。怎么找出这两个数
- 【c语言】 给一组数,有两个数只出现了一次,其他所有数都是成对出现的。找出这两个数
- 【C语言】给一组组数,只有两个数只出现了一次,其他所有数都是成对出现的,找出这两个数。
- 找出一组数中只出现一次的两个数,其他所有数都是成对出现的
- 一组数字中只有两个数单独出现,其他数成对出现,找出这两个数
- 【c语言】给一组数,只有一个数只出现了一次,其他所有数都是成对出现的。找出这个数
- 一组数中,有两个数字各出现了一次,其他数字都是成对出现的,请找出这两个数。
- 一个数组中只有两个数字单独出现,其余数字都是成对出现的,请找出这两个数。
- 一组数据中只有一个数字出现了一次和 一组数据中只有两个个数字出现了一次其他所有数字都是成对出现的。请找出这个数字
- 一组数据中只有一个数字出现一次,其他数成对出现,找出这个数
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。请找出这个数字。
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。
- 一组数据中只有一个数字出现了一次。其他所有数字都是成对出现的。 请找出这个数字。
- 一组数据中只有一个数字出现了一次,其他所有数字都是成对出现的。 请找出这个数字。
- 一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,找出这两个数
- 折半查找------在一个升序的有序数组中查找某个具体的数字
- 三子连珠游戏
- 全局变量 静态变量 局部变量分析
- 单链表的各种操作
- 替换字符串中的空格
- 一组数中,只有两个数只出现了奇数次,其他所有数都是成对出现的,请找出那两个数
- 冒泡排序函数,可以给任意类型的数据排序,比如整形数组,字符数组,字符串数组等
- 快速排序函数的比较函数
- 网卡驱动程序设计---网络子系统深入分析以及DM9000网卡驱动实现
- 二叉树 的先序 中序、后序遍历、层次遍历以及树状打印等操作
- C语言利用结构体实现一个通讯录
- C语言的注释与C++注释的转换
- 两个链表的合并
- 单链表的操作