此题可以运用异或运算的性质,遍历一次数组,将所有元素做一次异或运算,所有元素的异或运算结果即为数组中只出现一次的数字。
异或运算的性质
此题比较简单,但位运算使我们很容易忽略掉的方法,用好位运算有时会大大简化题目和代码。
class Solution {
public int singleNumber(int[] nums) {
int single = 0;
for(int i=0;i<nums.length;i++){
single ^= nums[i];
}
return single;
}
}
先随机初始化一个数maj,维护它出现的次数count。遍历数组动态改变maj的值,以及它出现的次数。
maj的值,以及count更新规则如下:
class Solution {
public int majorityElement(int[] nums) {
int count = 0; //计数器
int maj = 0; // 当前的众数
for(int i=0;i<nums.length;i++){
if(nums[i] == maj){ //与maj相等,计数器+1
count++;
}else{ //不等
if(count > 0){ // 先判断计数器是否大于0
--count; // 大于0,则计数器-1
}else{ // 计数器小于0
maj = nums[i]; // 将当前值赋予为众数
}
}
}
return maj; // 遍历完成maj值,即为多数元素
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_43598687/article/details/123361177
内容来源于网络,如有侵权,请联系作者删除!