题解 | #24点#

24点

http://www.nowcoder.com/questionTerminal/263fa05acac5424a91214694a1c1eb8f

首先需要求出所有的子集合
已知父集合长度为N可知子集合的数量 = 2^n = 1 << n
再通过 i & (1 << j)) > 0 判断父集合中的每一位是否匹配上 求出子集合
最终遍历子集合列表求出和为24的结果有多少个

import java.util.*;

public class Main {


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int size = in.nextInt();
        List<Integer> numList = new ArrayList<>();
        for (int i = 0; i < size; i++) {
            int num = in.nextInt();
            numList.add(num);
        }
        System.out.println(getResult(numList));
    }

    /**
     * 获取符合24点的数量
     * @param numList 待计算集合
     * @return 符合24点的数量
     */
    public static int getResult(List<Integer> numList) {
        Set<List<Integer>> listSonList = getListSon(numList);

        int count = 0;
        for (List<Integer> numSonList : listSonList) {
            int sum = 0;
            for (Integer num : numSonList) {
                sum += num;
            }
            if (sum == 24) {
//                System.out.println(numSonList);
                count++;
            }
        }
        return count;
    }

    /**
     * 获取 所有 子集合
     * 可知子集合总数为 2^n == 1 << n
     * @param numList 父集合
     * @return 子集合Set
     */
    public static Set<List<Integer>> getListSon(List<Integer> numList) {
        int n = numList.size();

        Set<List<Integer>> listSonList = new HashSet<>();

        for (int i = 0; i < 1 << n; i++) {
            List<Integer> listSon = new ArrayList<>();
            for (int j = 0; j < n; j++) {
                // 分别判断集合每一位是否与二进制位匹配上
                if ((i & (1 << j)) > 0) {
                    listSon.add(numList.get(j));
                }
            }
            Collections.sort(listSon);
            listSonList.add(listSon);
        }

        return listSonList;
    }
}
全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务