《算法通关村——黄金挑战数组问题》

《算法通关村------黄金挑战数组问题》

数组中出现次数超过一半的数字

描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如:输入如下所示的一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2,如果不存在则输出0。

解题

java 复制代码
/**
 * 利用Map很容易就能得到。
 * @param array
 * @return
 */
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 < len; i++){
        res.put(array[i],res.getOrDefault(array[i],0)+1);
        if(res.get(array[i])>len/2){
            return array[i]; // 找到那一个元素就直接返回啦。
        }
    }
    return 0;
}

/**
 * 会有一定的缺陷,算是一个找到的规律。
 * @param nums
 * @return
 */
public static int majorityElement(int[] nums){
    int count = 0;
    Integer candidate = null;

    for(int num : nums) {
        if(count == 0){
            candidate = num;
        }
        count += (num==candidate)?1:-1;
    }
    return candidate;
}

数组中只出现一次的数字

描述

LeetCode136.给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次,找出那个只出现了一次的元素。

复制代码
示例1: 
输入:[2,2,1] 
输出:1 
示例2: 
输入:[4,1,2,1,2] 
输出:4

解决

java 复制代码
/**
 * 通过集合处理,如果在集合中出现两次,集合添加会不成功,这个是关键。
 * @param nums
 * @return
 */
public static Integer findOneNum(int[] nums){
    Set<Integer> set = new HashSet<>();
    for(int i : nums){
        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];
}

/**
 * 异或的关键是,异或了如果有两个相同的比如说a^b^a = b 抓住这个关键点就好了,因为题目中说明每个数除了一个其他都出现两次。
 * @param arr
 * @return
 */
public static int findOneNum1(int[] arr){
    int flag = 0;
    for(int i : arr){
        flag^=i;
    }
    return flag;
}

颜色分类问题

描述

LeetCode75,也称为荷兰国旗问题。给定一个包含红色、白色和蓝色、共 n 个元素的数组 nums ,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。 我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。必须在不使用库的sort函数的情况下解决这个问题。

复制代码
示例: 
输入:nums = [2,0,2,1,1,0] 
输出:[0,0,1,1,2,2]

解决

java 复制代码
/**
 * 两次排序其实就是排好0,然后排好1,要两次遍历。
 * @param nums
 */
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 ++;
        }
    }
}

/**
 * 理解这个方法其实就是如果遇到0就往左边放,如果遇到2就往右边放就好了
 * @param nums
 */
public static void sortColors1(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++;
    }
}
public static void swap(int[] arr,int i,int j){
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
 }

近期在自学 Java 做项目,加入了一个编程学习圈子,里面有编程学习路线和原创的项目教程,感觉非常不错。还可以 1 对 1 和大厂嘉宾交流答疑,也希望能对大家有帮助,扫 ⬇️ 二维码即可加入。

也可以点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?

也可以加我QQ(2837468248)咨询说明来意!

相关推荐
格林威4 分钟前
常规线扫描镜头有哪些类型?能做什么?
人工智能·深度学习·数码相机·算法·计算机视觉·视觉检测·工业镜头
程序员莫小特2 小时前
老题新解|大整数加法
数据结构·c++·算法
过往入尘土3 小时前
服务端与客户端的简单链接
人工智能·python·算法·pycharm·大模型
zycoder.3 小时前
力扣面试经典150题day1第一题(lc88),第二题(lc27)
算法·leetcode·面试
Dream it possible!3 小时前
LeetCode 面试经典 150_哈希表_存在重复元素 II(46_219_C++_简单)
leetcode·面试·散列表
蒙奇D索大3 小时前
【数据结构】考研数据结构核心考点:二叉排序树(BST)全方位详解与代码实现
数据结构·笔记·学习·考研·算法·改行学it
智驱力人工智能4 小时前
工厂抽烟检测系统 智能化安全管控新方案 加油站吸烟检测技术 吸烟行为智能监测
人工智能·算法·安全·边缘计算·抽烟检测算法·工厂抽烟检测系统·吸烟监测
学学学无无止境4 小时前
组合两个表-力扣
leetcode
程序员爱钓鱼4 小时前
Go语言实战案例——进阶与部署篇:编写Makefile自动构建Go项目
后端·算法·go
_Power_Y5 小时前
Java面试常用算法api速刷
java·算法·面试