一个有意思的算法题:7个红包金额尾数等于10的组合和各尾数出现次数统计
这是一个群友给的题目。题目的大概意思就是
发七个红包,红包金额的尾数相加为10的组合
如以下数据
1.02,1.02,1.03,1.01,1.10,1.10,1.02
上面的数据 2+2+3+1+0+0+2=10
需要注意的是,与顺序无关,也就是说上面的数据顺序变了,数值没有变,那也只能作为一条数据
上面的数据我们可以写成 2231002
其实您只需要相通了,将2231002里面的0去掉,这个题也就比较好解了,全部的代码如下(代码仅供参考):
package cn.test; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; public class Test { //将其转换为char数组 public static char[] charArray = null; //这个char数组的长度 public static int charArrayint = 0; //当前这个数组所有char相加 public static int charArrayCount = 0; public static Map mapLink = new LinkedHashMap(); //最后的结果 public static Map map = new HashMap(); //用于快速查询 public static Map mapCount = new HashMap(); //统计每个数据出现的次数 public static char[] charArrayTemp = null; //临时的待统计的数据 //数据开关 public static boolean b = false; //有数据 public static int is = 0; //无数据 // public static int isn = 0; public static int index = 0; public static Map isDatasMap = null; static { mapCount.put("0", 0); mapCount.put("1", 0); mapCount.put("2", 0); mapCount.put("3", 0); mapCount.put("4", 0); mapCount.put("5", 0); mapCount.put("6", 0); mapCount.put("7", 0); mapCount.put("8", 0); mapCount.put("9", 0); } public static void main(String[] args) { mapLink.put("0000000", "0000000"); for(int i=1;i=0) { continue; } charArray = String.valueOf(i).toCharArray(); charArrayint = charArray.length; for(int j=0;j<charArrayint;j++) { charArrayCount+=Integer.parseInt(String.valueOf(charArray[j])); } if(charArrayCount==0||charArrayCount==10) { isDatasMap =new HashMap(); //验证这条数据是否存在 //遍历map for(Entry m:map.entrySet()) { if(m.getKey().length()<String.valueOf(i).length()) { continue; } //遍历每一位char,看看是否存在 for(int j=0;j<charArrayint;j++) { if(m.getValue().indexOf(charArray[j])<0) { //说明没有 //isn++; }else { //说明有 is++; } if(j==charArrayint-1) { isDatasMap.put(m.getValue(), String.valueOf(is)); is=0; } } } b = isB(isDatasMap,String.valueOf(i).length()); if(b || null==map || map.size()==0) { //将数据保存 mapLink.put(String.format("%07d", i), String.format("%07d", i)); map.put(String.valueOf(i), String.valueOf(i)); b=false; } } charArrayCount = 0; } //遍历maplink数据 for(Entry ms:mapLink.entrySet()) { //统计数据 //开始统计 charArrayTemp = ms.getKey().toCharArray(); for(char c:charArrayTemp) { mapCount.put(String.valueOf(c), mapCount.get(String.valueOf(c))+1); } System.out.println(ms.getValue()); } //打印出结果 for(Entry mint:mapCount.entrySet()) { System.out.println(mint.getKey()+"出现的次数为: "+mint.getValue()); }将 } private static boolean isB(Map map,int lenI) { for(Entry m:map.entrySet()) { if(lenI==Integer.parseInt(m.getValue())) { return false; } } return true; } }
以上代码仅供参考,可能题意有错误。
运行上面的代码,部门打印结果如下:
0111223
1111114
1111123
0出现的次数为: 96
1出现的次数为: 58
2出现的次数为: 18
3出现的次数为: 14
4出现的次数为: 12
5出现的次数为: 8
6出现的次数为: 5
7出现的次数为: 3
8出现的次数为: 2
9出现的次数为: 1
爆款云服务器s6 2核4G 低至0.46/天,具体规则查看活动详情