华为机试---微信红包

来源:互联网 发布: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