一个有意思的算法题: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/天,具体规则查看活动详情