一个有意思的算法题:7个红包金额尾数等于10的组合和各尾数出现次数统计

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