数组中数字出现的次数
题目传送门:题目链接
题目大意是,在一个数组中,有几个元素,这些元素中有一些出现了两次,有两个出现了一次,要求输出这两个只出现了一次的元素。
又是观摩大佬题解的一天,首先说一个内容,那就是异或的交换律,对于按位异或的操作,不难知道,如果位相同,则结果为0,如果位不同,则结果为1,而且这异或操作是可以遵循交换率的,也就是说 AorBorC == AorCorB。
由于数组中有些元素出现了两次,所以,他们如果异或的话,结果是0,倘若只有一个元素出现了一次,将数组中全部元素异或,最后的结果就是只出现一次的元素,但是本题目中有两个这样的元素,所以需要做一些操作,让这两个元素分到两个数组中,分别异或。
首先,数组全部元素异或,得到一个数字,不难看出,这个结果就是两个只出现一次的元素A、B的异或结果R,由于AB并不相同,所以R肯定有某几位为1,,例如R为10110,我们取10,也就是说A和B其中一个数字的第二位为1,另一个的第二位为0,直接将所有元素和10进行按位与运算,可以根据得到的结果是否为0将AB分到两个组,然后组中其他元素都出现了两次,直接进行异或即可得到最终结果
public int[] singleNumbers(int[] nums) {
int[] result = new int[2];
int mm = 0;
for(int num : nums) {
//求出全部数据异或后的结果
mm = mm ^= num;
}
int nn = 1;
while((mm&nn)==0) {
nn = nn << 1;
}
int x = 0, y = 0;
for(int num : nums) {
if((num^nn)==0) {
x = x ^ num;
}else {
y = y ^ num;
}
}
return new int[] {x, y};
}
学习了一下异或操作的实际应用,数组去重