4条回答 默认 最新
- 小 鱼 儿 呀 2021-11-25 17:20关注
小兄弟,问题给你解决了,时空性都考虑到了,九层循环太浮夸,这个还有优化空间
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无用