下面这道题据说是腾讯2016年的一道校招笔试题,下面我给出一个菜鸟的分析与解答。
春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。请返回所求红包的金额。测试样例:
[1,2,3,2,2],5
返回:2
<pre name="code" class="java">package tencent;
import java.util.*;
public class tencentTest {
public int getValue(int[] gifts, int n) {
// write code here
int fre = 0;
int fremax = 0;
int res = 0;
int[] c = new int[n];
for(int x=0;x<n;x++){
fre = 0;//每一个金额出现次数重置
for(int y = 0;y<n;y++){
if(gifts[x]==gifts[y]){
fre +=1;
}
}
c[x]=fre;
}
for(int x=0;x<n;x++){
fremax = c[0];
if(c[x]>=fremax){
fremax=c[x];
}
}
for(int x=0;x<n;x++){
if(fremax==c[x]){
res = x;
}
}
return gifts[res];
}
public static void main(String args[]){
int a[] = {37256,61520,11540,61520,69323,61520,61520};
tencentTest t = new tencentTest();
int s = t.getValue(a, 7);
System.out.println(s);
}
}
根据题目要求,我们首先要统计每一个红包金额出现的次数,可以遍历gift数组,每取出一个金额数,遍历一遍该数组,以计算该金额数的次数。将对应的次数存入一个数组从c[n]中,当某个金额数出现的次数大于n/2时,那么他肯定是c[n]数组中所有值的最大值,我们通过判断该值在c[n]中的位置,即可得出对应的金额数。
当然算法比较笨,效率肯定不高,新手上路,请多关照。