题解 | #数组分组#

数组分组

https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()) {
            int size = scanner.nextInt();// 存储数量
            ArrayList<Integer> arrForRest = new ArrayList<>(); // 存储既非3,又非5的倍数
            int sumFor5 = 0,sumFor3 = 0;
            for (int i = 0; i < size ; i++) {
                int curNum= scanner.nextInt();
                if (curNum%5 == 0) {
                    sumFor5 = sumFor5 + curNum; // 把5的倍数加在一起的和
                }else if (curNum%3 == 0 && curNum%5 != 0) {
                    sumFor3 = sumFor3 + curNum; // 把3的倍数但不是5的倍数加在一起的和
                }
                else {
                    arrForRest.add(curNum); // 既非3,又非5的倍数,单独存放进arrForRest数组。该数组元素可能加在sumFor5,也可能加在sumFor3。递归树左右两分支,递归处理。
                }
            }

            LinkedList<Boolean> list = new LinkedList(); // 用于存放递归树叶子到达叶子节点时,比较sumFor5 == sumFor5,如果是,记录true 1次
            backTrace(arrForRest,sumFor3,sumFor5,0,list);

            if (list.size() == 0) { // 无一个解
                System.out.println(false);
            } else {
                System.out.println(true);
            }
        }

    }

    private static void backTrace(ArrayList<Integer> arrForRest,int sumFor3,int sumFor5,int index,LinkedList list) {
        if (index >= arrForRest.size()) { // 索引越过arrForRest尾部,说明递归到底
            if (sumFor3 == sumFor5) {
                list.add(true); // 递归到底,且两和相等,说明存在一个解,记录1次
            }
            return;
        }
        backTrace(arrForRest,sumFor3 + arrForRest.get(index),sumFor5,index+1,list);// 元素加在3的倍数但不是5的倍数 分支中
        backTrace(arrForRest,sumFor3,sumFor5 + arrForRest.get(index),index+1,list);// 元素加在5的倍数 分支中
    }

}

全部评论

相关推荐

M_bao:换个排版吧哥们,看着费劲
点赞 评论 收藏
分享
10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务