华为机试---微信红包
来源:互联网 发布:mac 远程桌面 iphone 编辑:程序博客网 时间:2024/05/10 05:01
题目描述
春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。
给定一个红包的金额数组gifts及它的大小n,请返回所求红包的金额。
若没有金额超过总数的一半,返回0。测试样例:
[1,2,3,2,2],5
返回:2
两种解法尝试
算法思想(1):1.相当于一个消除游戏,采用栈来保存数据2.当栈为空时,直接压入元素3.当栈非空时,判断栈顶元素和要压入的元素是否相同,如果相同压入元素, 如果不相同,弹出栈顶元素,并且不进行压栈操作(相当于两个相邻元素不同时同时删除)4.如果存在一个红包金额出现的次数超过红包总数的一半,则栈顶元素一定是该红包金额,否则栈顶为空5.本题存在这种可能,如果没有金额超过总数的一半,需要增加判断6.遍历数组,统计栈顶元素出现的次数是否大于n/2,如果大于返回栈顶元素,否则返回0
private static int getValue(int[] gifts, int n) { Stack<Integer> stack = new Stack<Integer>(); for(int i = 0 ; i < n ; i++){ //如果栈为空,直接进行压栈操作,不判断是否相同 if(stack.isEmpty()){ stack.push(gifts[i]); }else{ //如果栈不为空,判断栈顶元素和要压栈的元素是否相同 //如果相同,进行压栈操作 if(stack.peek().equals(gifts[i])){ stack.push(gifts[i]); }else{ //如果不同,删除掉栈顶元素 stack.pop(); } } } int count = 0; int result = 0; //栈空,表示没有金额超过总数的一半 if(stack.isEmpty()){ return 0; }else{ //栈非空,判断栈顶元素出现的次数是否超过红包总数的一半 result = stack.peek(); for(int i = 0 ; i < n ; i++){ if(result == gifts[i]){ count++; } } return count > n / 2 ? result : 0; } }算法思想(2):1.排序数组,从小到大2.如果存在一个红包金额出现的次数超过红包总数的一半,必然排在中间3.遍历整个数组,统计中间元素出现的次数是否大于n/2
private static int getValue(int[] gifts , int n){ Arrays.sort(gifts); int result = gifts[n / 2]; int count = 0; for(int i = 0 ; i < n ; i++){ if(result == gifts[i]){ count++; } } return count > n / 2 ? result : 0; }
1 0
- 华为机试---微信红包
- 微信红包
- 微信红包算法
- 微信现金红包
- 微信红包算法
- 微信红包
- 微信红包
- 微信红包
- 微信裂变红包
- 微信处理红包
- 微信红包算法
- 微信红包算法
- 微信红包算法
- 微信红包
- 模仿微信红包
- 微信红包算法
- 微信红包
- 微信红包
- Java 中 String 类的常用方法
- PHP文件上传
- python selenium 界面截图
- linux awk命令详解
- ios开发release、develop、adHoc证书区别
- 华为机试---微信红包
- Locks, Deadlocks, and Synchronization
- SQLite数据库的增删改查
- Atom 编辑器基本配置
- 解决通过URL传值中文乱码问题
- yarn 调度器 resourcemanager 的 Capacity Scheduler 部分配置说明
- 构建自己的Java Web框架(二)之一个Filter引发的血案
- 002——缺少commons-beanutils包
- FCM算法研究(一)