数组中出现次数超过一半的数字
public static int moreThanHalfNum(int[] array) {
if (array == null) {
return 0;
}
Map<Integer, Integer> res = new HashMap<>();
int len = array.length;
for (int i = 0; i < array.length; i++) {
res.put(array[i], res.getOrDefault(array[i], 0) + 1);
if (res.get(array[i]) > len / 2) {
return array[i];
}
}
return 0;
}
数组中只出现一次的数字
基于set集合寻找
public static Integer findOneNum(int[] arr) {
Set<Integer> set = new HashSet<Integer>();
for (int i : arr) {
if (!set.add(i)) { //添加不成功返回false,前加上!运算符变为true
set.remove(i);
}//移除集合中与这个要添加的数重复的元素
}
//注意边界条件的处理
if (set.size() == 0) {
return null;
}
//如果Set集合长度为0,返回null表示没找到
return set.toArray(new Integer[set.size()])[0];
}
位运算
public static int findOneNum2(int[] arr) {
int flag = 0;
for(int i : arr) {
flag ^= i;
}
return flag;
}
荷兰国旗问题
快慢指针
public static void sortColors(int[] nums) {
int n = nums.length;
int left = 0;
//将所有的0交换到数组的最前面
for (int right = 0; right < n; right++) {
if (nums[right] == 0) {
int temp = nums[right];
nums[right] = nums[left];
nums[left] = temp;
left++;
}
}
//将所有的1交换到2的前面
for (int right = left; right < n; ++right) {
if (nums[right] == 1) {
int temp = nums[right];
nums[right] = nums[left];
nums[left] = temp;
++left;
}
}
}
三指针
public void sortColors(int[] nums){
int left=0,right=nums.length-1;
int index=0;
while(index<=right){
if(nums [index]==0){
swap(nums,index++,left++);
}else if(nums[index]==2){
swap(nums,index,right--);
}else{
index++;
}
}
}
private void swap(int[] nums,int i,int j){
int temp=nums[i];
nums [i]=nums[j];
nums[j]=temp;
}