思路分析: 方法一:涉及到两个数,就要用到异或定理了:若a^b=x,则a=b^x,b=x^a。对于这道题,假设这两个数分别为a、b,将数组中所有元素异或之后结果为x,因为a!=b,所以x=a^b,且x!=0,判断x中位为1的位数,只需要知道某一个位为1的位数k,如00101100,k可以取2或者3,或者5.因为x中第k位为1表示a或b中有一个数的第k位也为1,假设为a,将x与数组中第k位为1的数进行异或时,也即将x与a以及其他第k位为1的出现过偶数次的数进行异或,化简即为x与a异或,最终结果即为b。程序示例如下:#include "stdafx.h"#include voi Read More
posted @ 2014-03-14 11:04 源子陌 Views(1450) Comments(0) Diggs(0) Edit
思路分析:任何一个数字异或它自己都等于0,根据这一特性,如果从头到尾依次异或数组中的每一个数字,因为那些出现两次的数字全部在异或中抵消掉了,所以最终的结果刚好是那些只出现一次的数字。代码如下:#include "stdafx.h"#include int findNotDouble(int a[], int n){ int result = a[0]; int i; for (i = 1; i < n; ++i) result ^= a[i]; return result;}int main(){ int array[] = { 1, 2, 3, 2... Read More
posted @ 2014-03-14 10:18 源子陌 Views(814) Comments(0) Diggs(0) Edit
思路分析:可以与归并排序联系起来,给定两个变量A、B,变量A轮着存放:a*1,a*2,a*3,……变量组B轮着存放:b*1,b*2,b*3,……有两个整数i、j,分别代表A、B第i、j次存放的值,每次取A、B中的较小值,并将较小值的次数加一,然后继续比较。代码如下:#include "stdafx.h"#includevoid Generate(int a, int b, int N, int *Q){ int tmpA, tmpB; int i = 1; int j = 1; for (int k = 0; k < N; k++) { tmpA =... Read More
posted @ 2014-03-14 09:41 源子陌 Views(343) Comments(0) Diggs(0) Edit