Java题不知道怎么去掉数字重复出现的情况

img

小兄弟,问题给你解决了,时空性都考虑到了,九层循环太浮夸,这个还有优化空间

img

import java.util.*;
import org.apache.commons.collections.map.LinkedMap;
import org.apache.commons.lang3.StringUtils;
    public static void main(String[] args) {
        //1 求出 ** X * = ***
        List<Integer>  numArr = Arrays.asList(0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
        //2 从1中筛选     ** X * = ***   =   ** X * 且(*处于0-9)
        findShouer(numArr);
    }
    private static void findShouer(List<Integer> numArr) {
       Map<Integer, String> maps = new LinkedMap();
        int[] flagArr = getInts();
        for(int key1=0;key1<numArr.size();key1++){
            //选取 ** X *里的第一个因数十位*,并给对应标志数组打已用标志
            flagArr[key1]=1;
            for(int key2:getLiftChoice(flagArr)){
                //选取 ** X *里的第一个因数个位*,并给对应标志数组打已用标志
                flagArr[key2]=1;
                for(int key3:getLiftChoice(flagArr)){
                    //选取 ** X *里的第二个因数*,并给对应标志数组打已用标志
                    flagArr[key3] = 1;
                    //选取符合***不与因数重合条件的所有积
                    Set<Integer> listResult = getListResult(getLiftChoice(flagArr));
                    int temp = (numArr.indexOf(key1) * 10 + numArr.indexOf(key2)) * numArr.indexOf(key3);
                    if(listResult.contains(temp)){
                        if(maps.containsKey(temp)){
                            if(!StringUtils.containsAny(maps.get(temp)+""+temp,key1+"",key2+"",key3+""))
                            System.out.println(maps.get(temp)+"="+key1+""+key2+"*"+key3);
                        }else{
                            maps.put(temp,key1+""+key2+"*"+key3+"="+temp);
                        }
                    }
                    flagArr[key3] = 0;
                }
                flagArr[key2] = 0;
            }
            flagArr[key1] = 0;
        }
    }

    private static Set<Integer> getListResult(List<Integer> liftChoice) {
        Set<Integer> resultList=new LinkedHashSet<>();
        for(int i=0;i<liftChoice.size();i++){
            int bai=liftChoice.get(i)*100;
            for(int j=0;j<liftChoice.size();j++) {
                int shi = liftChoice.get(j) * 10;
                for (int k = 0; k < liftChoice.size(); k++) {
                    int ge = liftChoice.get(k);
                    if(i!=j&&i!=k&&j!=k)
                    resultList.add(bai+shi+ge);
                }
            }
        }
        return resultList;
    }

    private static int[] getInts() {
        int[]  flagArr={0,0,0,0,0,0,0,0,0,0};
        return flagArr;
    }
    private static List<Integer>  getLiftChoice(int[] flagArr) {
        List<Integer>  numChoice =new ArrayList<>();
        for(int i=0;i<flagArr.length;i++){
            if(1!=flagArr[i]){
                numChoice.add(i);
            }
        }
        return numChoice;
    }


定义1~9,放入数组,随机取值,取值后去掉该值

逻辑最简单,效率最低的写法就是写9个循环,一个一个的试

暴利破解法。
从1~9中不重复的排列出9个数,按照先后顺序填入两个等式中,正好9个空位,如果两个等式成立,那就是结果。