java arraylist 个数_Java中的一个递归方法,它返回一个整数的arrayList(只是其中一个),它总结为一个数字,如果没有则返回null...

首先,如果您使用的是Java 8,那么 List list 的求和就像 list.stream().mapToInt(n -> n).sum() 一样简单 .

其次,递归总是采用类似的形式:

func(context)

if context in simple form

return simple result

else

break context down into smaller pieces

call func on smaller pieces

在你的情况下,它看起来像

func(total, list)

if sum(list) == total

return list

else if list is not empty

get all solutions from func(total - first item, list without first item)

and func(total, list without first item)

这里有一些棘手的事情需要考虑:

如何处理返回列表以及它是否是有效结果

如何删除项目,然后在递归调用后将其添加回来

这是一个带有测试用例的示例解决方案 .

public class ListSum {

public static void main(String[] args) {

subsetsThatSumTo(18, Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)).forEach(System.out::println);

}

public static List> subsetsThatSumTo(int total, List list) {

List> result = new ArrayList<>();

if (list.stream().mapToInt(n -> n).sum() == total) {

result.add(new ArrayList<>(list));

} else if (!list.isEmpty()) {

subsetsThatSumTo(total - list.get(0), list.subList(1, list.size())).forEach(result::add);

result.forEach(l -> l.add(0, list.get(0)));

subsetsThatSumTo(total, list.subList(1, list.size())).forEach(result::add);

}

return result;

}

}

如果您只想返回第一个结果:

public class ListSum {

public static void main(String[] args) {

System.out.println(subsetThatSumTo(18, Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)));

}

public static List subsetThatSumTo(int total, List list) {

if (list.stream().mapToInt(n -> n).sum() == total)

return new ArrayList<>(list);

if (list.isEmpty())

return null;

List result = subsetThatSumTo(total - list.get(0), list.subList(1, list.size()));

if (result != null) {

result.add(0, list.get(0));

return result;

} else {

return subsetThatSumTo(total, list.subList(1, list.size()));

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值