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

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

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

描述

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 例如:输入如下所示的一个长度为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)咨询说明来意!

相关推荐
江畔柳前堤6 小时前
大语言模型分布式训练:从并行策略到万卡工程的系统梳理
人工智能·分布式·深度学习·算法·目标检测·机器学习·语言模型
Forever Nore7 小时前
LeetCode 4 寻找两个正序数组的中位数 - 二分
算法·leetcode
罗西的思考8 小时前
【OpenClaw具身硬件】MiniClaw 阅读笔记---(1)基础
人工智能·算法·机器学习
蛋先生DX9 小时前
大模型参数存储格式揭秘:BF不是男朋友
深度学习·算法·llm
爱跳舞的烤冷面10 小时前
自学嵌入式第22天(数据结构——哈希)
数据结构·算法·哈希算法
猎嘤一号10 小时前
博弈论(Game Theory)的理论、算法与工程
人工智能·算法·安全·博弈论
月光船幽幽10 小时前
影子模式下保护 logits 不被修改
人工智能·python·算法
马拉AI10 小时前
腾讯开源 Agent 记忆系统,AI“换对话就忘”的问题有了新解法(附安装使用教程)
人工智能·算法·开源·科研
地平线开发者12 小时前
征程6工具链模型X86推理方式说明
算法
地平线开发者12 小时前
【征程6】校准量化中HistogramObserver解析
算法