编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 01.用类实现一维数组
  • 02.从数组中删除重复项
  • 03.啤酒与饮料
  • 04.二维数组中查找
  • 05.数组中重复的数字
  • 06.和为s的两个数字
  • 07.数组中只出现一次数字
  • 08.数组中只出现一次的数字
  • 09.买卖股票最佳时机
  • 10.调整数组顺序
  • 11.找出常用的数字
  • 12.旋转数组的最小数字
  • 13.调整数组顺序使奇数位于偶数前面
  • 14.顺时针打印矩阵
  • 15.数组中出现次数超过一半的数字
  • 16.最小的k个数
  • 17.连续子数组的最大和
  • 18.把数组排成最小的数
  • 19.数组中的逆序对
  • 20.在排序数组中出现的次数
  • 21.滑动窗口的最大值

11.找出常用的数字

目录介绍

  • 01.题目要求
  • 02.问题分析
  • 03.实例代码
  • 04.如何优化
  • 05.优化代码

01.题目要求

  • 问题如下所示:
    • 给你一个长度为n的数组,其中有一个数字出现的次数至少为n/2,找出这个数字
    • 注意,需要的是排序的数组

02.问题分析

  • 使用栈的思想来做
    • 如果栈是空的,那么先把数据存进去
    • 然后继续遍历其他的数据,只要发现栈中的数据和遍历中的数据不一样,那么就出栈
    • 如果是相同的,那么就入栈
    • 其实就是捉住数字出现的次数多于数组一半的长度这里入手。如果这个数出现的次数是大于这个数组长度的2/1,那么最后留下的肯定是这个数
  • 示例 1:
    输入: [1,1,1,2,5,7,8,8,8,8,10]
    输出: 8

03.实例代码

  • 如下所示
    int removeDuplicates(int[] num) {
        if (num==null || num.length==0){
            return 0;
        }
        int currentV = num[0];
        int count = 0;
        for(int i = 1 ; i < num.length; i++){
            if(num[i] != currentV){
                count++;
                currentV = num[i];
                num[count] = currentV;
            }
        }
        return count+1;
    }

04.如何优化

  • 其实没必要用整个栈来装载数组,因为使用栈顶元素(出现次数最多的那个),而栈的大小也可以通过一个变量就可以来确定了
  • 只要元素相同->入栈(长度+1)。元素不相同-->出栈(长度-1)
  • 最终留下来的肯定是出现最频繁的那个数字!

05.优化代码

  • 如下所示
    public int findMajorityElement2(int[] arrays) {
        if (arrays==null || arrays.length==0){
            return 0;
        }
        // 装载栈的元素
        int candidate = -1;
        // 栈的大小(长度)
        int count = 0;
        // 遍历给出的数组
        for (int i = 0; i < arrays.length; i++) {
            // 判断该栈为空,那么直接将元素入栈
            if (count == 0) {
                candidate = arrays[i];
                count++;
            } else if (candidate == arrays[i]) {
                // 该元素是否与栈的元素一致-->入栈(栈多一个元素)
                count++;
            } else {
                // 只要不一致-->出栈(栈少一个元素)
                count--;
            }
        }
        // 只要该数字出现次数大于数组长度的2/1,那么留下来的数字肯定在栈顶中
        return candidate;
    }
贡献者: yangchong211
上一篇
10.调整数组顺序
下一篇
12.旋转数组的最小数字