需求描述
在各大电商购物平台上,常常会举行抽奖活动,假设我们的每个用户有一串唯一的ID,由一串数字组成,长度固定,我们的抽奖是从所有用户ID的每一位取众数,然后拼接成一个中奖的ID
算法
如果让我们不考虑算法计算机编程什么的,让我们用人力进行这样一个手动的的得到一个众数ID,我们经过思考可能会得到一种方案:
列一个表格,列名写的是从0~9,行名写的是用户ID的个位、十位、百位、千位…在表格中填的是每个数字的出现次数,如图:
数字种类 | 第一位 | 第二位 | 第三位 | 第四位 | 第五位 | 第六位 | … |
---|---|---|---|---|---|---|---|
0 | |||||||
1 | |||||||
2 | |||||||
3 | |||||||
4 | |||||||
5 | |||||||
6 | |||||||
7 | |||||||
8 | |||||||
9 |
我们手动要做的就是一个个的把每一位的每种数字出现的个数一个个地向表格中填入,最后,在每一位中选出一个出现次数最多的数,将它作为这一位的众数,最后,将每一位的众数拼接起来,就可以得到一串每一位数都是众数的数。
显然,二位数组就是类似表格的东西,那么,我们的这个人工的算法完全可以用计算机实现,下面我们来看一看源码,我们的用户ID以六位数为例:
源码
public static void main(String[] args) {
//示例ID
String[] userIds={"876238","928734","457834","234809","482673","439758"};
//声明一个行数0~9,列数是位数也就是6的二维数组
int a[][]=new int[10][userIds[0].length()];
for(int i=0,iLength=userIds.length;i<iLength;i++)
{
for(int j=0,jLength=userIds[i].length();j<jLength;j++)
{
int index=userIds[i].charAt(j)-'0';
System.out.println("index"+index);
System.out.println("j"+j);
a[index][j]++;//向相应的表格位置代表的出现次数加1
}
}
//得到每一列的最大值,输出
for(int i=0;i<a[0].length;i++)
{
int max=0;
int x=0;
for(int j=0;j<a.length;j++)
{
if(max<a[j][i])
{
max=a[j][i];
x=j;
}
}
System.out.print(x);
}
}