只出现一次的数字
给定一个整型数组nums,其中恰好有两个元素出现一次,其余元素都出现两次,找出只出现一次的那两个元素。
分析有道类似的题目是只有一个元素出现一次,那么利用异或的特性,相同数字异或为0,异或结果不受顺序影响,将所有元素异或在一起最终结果就是只出现一次的元素。本题改成了两个元素未重复,如果将所有元素异或最终结果将是两个仅出现一次的元素的异或值。如何分开始终想不出来,看了答案才明白,最终的异或值必定是一个非0值,它的二进制也必定是一个至少包含一个1的数字,其中二进制位上的1说明这两个目标数字的这一二进制位不同,才会出现1,那么按照这一标准(该二进制位数字的不同)将这个数组分开,这两个目标数字必定分在不同两组,而两组数字分别异或就回到了最原始的题目。
#include <stdio.h> int main() { int arr[8]={1,1,2,2,4,5,7,7}; int i; int sz=sizeof(arr)/sizeof(arr[0]); int ret=0;//记录所有元素异或结果 int num=0;//记录异或结果二进制第几位是1 int m=0;//记录第一组异或结果 int n=0;//记录第二组异或结果 for(i=0;i<sz;i++) { ret^=arr[i]; } while(ret) { num++; if(ret%2) { break; } ret=ret/2; } for(i=0;i<sz;i++) { if(arr[i]&num)//num的二进制&目标元素恰好可以判断该位是否为1 { m^=arr[i]; } else { n^=arr[i]; } } printf("这两个数字分别是%d %d",m,n); return 0; }
浙公网安备 33010602011771号