有意思的coding分享

发布于:2022-12-30 ⋅ 阅读:(385) ⋅ 点赞:(0)

寻找最快分解

给一个最近的例题吧,coding真是人间一大乐事
对于目标数num
可以通过两个公式将其分解为 1;
两个公司分别为

  1. num = num - 1;
  2. num = a*b;
    找到最快分解为1的方式
  • case1: 2,7
  • 2可以分解为1 1
  • 7分解为 7 = 6+1
  • 6 = 2* 3
  • 3 - 1 =2
  • 2 = 11
    返回 5
class NodeTestOne {

    public static void main(String[] args) {

    /*
    其实就是找因数,如果为2,就是可行的,直接变,如果为4,就分成两个2,
    如果为3,就-1,分成2和1
    为6 就分成 2和3, 3!=2 ,继续拆分,如果3是质数,直接-1;
     */
        List<Integer> list = new ArrayList<>();
        List<Integer> listItr = new ArrayList<>();
        List<Integer> curList = new ArrayList<>();
        Integer record = 0;
        list.add(2);
        list.add(6);

        for (int i = 0; i < list.size(); i++) {
            int num = list.get(i);
            if(num==1)continue;
            if(num==2){
                curList.add(0);
                continue;
            }
            Iterator(list.get(i), listItr, num, curList);
        }
        System.out.println(curList.size());
    }

    private static void Iterator(Integer integer, List<Integer> listItr, int num, List<Integer> curList) {
        if(integer==2){
            curList.add(0);
            return ;
        }
        for (int j = 2; j < integer; j++) {
            if(j>num)break;
            while(num%j==0){
                if(j==2){
                    num = num / j;
                    curList.add(0);
                    break;
                }else {
                    num = num / j;
                    curList.add(0);
                    listItr.add(j);
                    break;
                }
            }
        }
        int temNum = 0 ;
        if(!listItr.isEmpty()){
            for (int i = 0; i < listItr.size(); i++) {
                temNum = listItr.get(i);
                Iterator(listItr.get(i), new ArrayList<>(), temNum, curList);
            }
        }else if(listItr.isEmpty()&&integer>2){
            integer -= 1;
            temNum = integer;
            curList.add(0);
            Iterator(integer, new ArrayList<>(), temNum, curList);
        }


    }

}

这里重点mark下

curList.add(0);

是我用来统计次数的,因为int/Integer ++都不会返回正确的值
这里应该是和java值传递有关系
还是基础啊,比较疑惑,以后搞

最接近的三数之和

class NodeTestTwo {

    public static void main(String[] args) {
        int[] arr = {-100,-98,-2,-1};
        int target = -101;
        Deque<Integer> list = new ArrayDeque<>();
        List<List<Integer>> listCol = new ArrayList<>();
        boolean[] isUsed = new boolean[arr.length];
        /*
        其实就是找到所有的三数集合,来暴力枚举
        1,2,1  2,1,4  1, 1,4
         */
        recursion(list, listCol, isUsed, arr, 0);
        System.out.println(listCol);

//        list.stream().mapToDouble(d->d).sum();
        List<Integer> list1 = listCol.stream().map((a)->{
            return a.stream().mapToInt(d->d).sum();
        }).collect(Collectors.toList());
        int min = Integer.MAX_VALUE;

        System.out.println(list1);
        int res = 0;
        for (int i = 0; i < list1.size(); i++) {
            if(Math.abs(list1.get(i)-target)<min){
                min = Math.abs(list1.get(i)-target);
                res = list1.get(i);
            }
        }
        
        System.out.println(res);

    }

    private static void recursion(Deque<Integer> list, List<List<Integer>> listCol, boolean[] isUsed, int[] arr, int position) {

        if(position==3){
            listCol.add(new ArrayList<>(list));
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            if(!isUsed[i]){
                list.addLast(arr[i]);
                isUsed[i] = true;
                recursion(list, listCol, isUsed, arr, position+1);
                list.removeLast();
                isUsed[i]=false;
            }
        }
    }
}

网站公告

今日签到

点亮在社区的每一天
去签到