算法复习之 暴力求解法

时间:2021-04-19 23:47:14   收藏:0   阅读:19

暴力求解法

简单枚举
  1. 给定一个整数n,按从小到大的顺序输出所有形如abcde / fghij = n的表达式,其中a ~ j 恰好为数字0 ~ 9 的一个全排列,可以有前导零。
    • 问题分析:我们没有必要去枚举所有0~9的全排列,而只需要枚举fghij,然后计算出abcde对应的数字,判断是否是0 ~ 9的全排列即可。
public static boolean isOk(int i, int n) {
    boolean[] flag = new boolean[10];
    Arrays.fill(flag, false);
    int num = i;
    int count = 0;
    while(num > 0) {
        int temp = num % 10;
        if(!flag[temp]) {
            flag[temp] = true;
            count ++;
        }
        else return false;
        num /= 10;
    }
    num = i * n;
    while(num > 0) {
        int temp = num % 10;
        if(!flag[temp]) {
            flag[temp] = true;
            count ++;
        } else return false;
        num /= 10;
    }
    if(count == 10 || (count == 9 && !flag[0])) return true;
    return false;
}

public static List<String> division(int n) {
    List<String> ans = new ArrayList<>();
    for(int i = 0; i * n < 98766; i ++) {
        if(isOk(i, n)) {
            StringBuilder sb = new StringBuilder();
            sb.append(i * n);
            sb.append(‘/‘);
            sb.append(i);
            ans.add(sb.toString());
        }
    }
    return ans;
}
生成全排列
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class GetPermutation {

    public static void getPermutation(List<List<Integer>> list, int n, int[] arr, int cur) {
        if(n == cur) {
            List<Integer> temp = new ArrayList<>();
            for(int i = 0; i < cur; i ++) {
                temp.add(arr[i]);
            }
            list.add(temp);
            return;
        } else for(int i = 1; i <= n; i ++) {
            boolean flag = true;
            for(int j = 0; j < cur; j ++) {
                if(arr[j] == i) flag = false;
            }
            if(flag) {
                arr[cur] = i;
                getPermutation(list, n, arr, cur + 1);
            }
        }
    }

    public static void main(String[] args) {
        int n = 4;
        int[] arr = new int[n];
        List<List<Integer>> list = new ArrayList<>(n);
        getPermutation(list, n, arr, 0);
        System.out.println(list);
    }

}
子集生成
public static void print(int n, int s) {
    for(int i = 0; i < n; i ++) {
        if((s & (1 << i)) > 0) { // 判断数字s二进制位上的每一位是否为1
            System.out.print(i + " ");
        }
    }
    System.out.println();
}

public static void main(String[] args) {
    int n = 3;
    for(int i = 1; i < (1 << n); i ++) {
        print(n, i);
    }
}

原文:https://www.cnblogs.com/bianjunting/p/14678688.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!