Java 集合、数组 任意个数数字相加等于一个指定的数

一组数字 任意个数数字相加的和等于指定的数字。  比如数字集合 1,2,3, 4,5,6  ,列出所有数字相加等于6的可能性,那么结果有:1+2+3,2+4, 主要这里的结果不是数组打乱顺序相加,而是按照数组顺序取任意个数相加减,所有大家看到结果只有1+2+3而没有1+3+2或则3+2+1

step1、实体类:

static class TestDTO  {
     String id; //id
    Integer num;//数字
     public String getId() {
        return id;
     }
    public void setId(String id) {
        this.id = id;
    }
    public Integer getNum() {
        return num;
    }

    public void setNum(Integer num) {
        this.num = num;
    }

}

step2、实现方法:

public  static List<List<TestDTO>>  Test(List<TestDTO> dtoParam,Integer samplesNumber) {
    List<List<TestDTO>>  reust = new ArrayList<List<TestDTO>>();
    int a=1;
    int c=1;
    List<TestDTO> d=null;
    for (int i = 0; i < dtoParam.size(); i++) {
        int s =  dtoParam.get(i).getNum();
       StringBuffer   str=new StringBuffer(dtoParam.get(i).getNum()+"+");//用于控制台打印显示,和逻辑无关
        boolean bb=true;
        while(bb){
            if(bb=false){
                break;
            }
            if(dtoParam.size()==a){
                bb=false;
                break;
            }
            boolean b=true;
            while(b){
                if(dtoParam.size()==c){
                    a++;
                    b=false;
                    c=a;
                    break;
                }
                d = new ArrayList<TestDTO>();
                d.add(dtoParam.get(i));
                for(int j=c;j<dtoParam.size();j++){
                    s = s + dtoParam.get(j).getNum();
                    d.add(dtoParam.get(j));
                     str.append(dtoParam.get(j).getNum()+"+");//用于控制台打印显示,和逻辑无关
                    System.out.println(str.substring(0,str.length()-1));//用于控制台打印显示,和逻辑无关
                    if (s == samplesNumber) {
                        reust.add(d);
                        break;
                    }
                    if(dtoParam.size()-j==1){
                        s =  dtoParam.get(i).getNum();
                        str=new StringBuffer(dtoParam.get(i).getNum()+"+");//用于控制台打印显示,和逻辑无关
                        c++;
                        break;
                    }
                }
            }
        }
    }
    return  reust;
}

step3、测试方法:

 public static void main(String[] args) {
 //模拟一个数字集合
   //模拟一个数字集合
        List<TestDTO> l=new ArrayList<TestDTO>();
        for(int i=1;i<10;i++){
            TestDTO d=new TestDTO();
            d.setId(i+"");
            d.setNum(i);
            l.add(d);
        }
        List<List<TestDTO>>  list=   Test(l,6);
        for (int i=0;i<list.size();i++){
            String str="";
            for(int j=0;j<list.get(i).size();j++){
                str=str+list.get(i).get(j).getNum()+"+";
            }
            System.out.println("第"+i+"个结果:"+str.substring(0,str.length()-1));
        }

}

step4、输出结果:

控制台输出所有数字相加的情况

1+2
1+2+3
1+2+3+2
1+2+3+2+3
1+2+3+2+3+4
1+2+3+2+3+4+5
1+2+3+2+3+4+5+6
1+2+3+2+3+4+5+6+7
1+2+3+2+3+4+5+6+7+8
1+2+3+2+3+4+5+6+7+8+9
1+3
1+3+4
1+3+4+5
1+3+4+5+6
1+3+4+5+6+7
1+3+4+5+6+7+8
1+3+4+5+6+7+8+9
1+4
1+4+5
1+4+5+6
1+4+5+6+7
1+4+5+6+7+8
1+4+5+6+7+8+9
1+5
1+5+5
1+5+5+6
1+5+5+6+7
1+5+5+6+7+8
1+5+5+6+7+8+9
1+6
1+6+7
1+6+7+8
1+6+7+8+9
1+7
1+7+8
1+7+8+9
1+8
1+8+9
1+9
2+3
2+3+4
2+3+4+5
2+3+4+5+6
2+3+4+5+6+7
2+3+4+5+6+7+8
2+3+4+5+6+7+8+9
2+4
2+4+4
2+4+4+5
2+4+4+5+6
2+4+4+5+6+7
2+4+4+5+6+7+8
2+4+4+5+6+7+8+9
2+5
2+5+6
2+5+6+7
2+5+6+7+8
2+5+6+7+8+9
2+6
2+6+7
2+6+7+8
2+6+7+8+9
2+7
2+7+8
2+7+8+9
2+8
2+8+9
2+9
3+4
3+4+5
3+4+5+6
3+4+5+6+7
3+4+5+6+7+8
3+4+5+6+7+8+9
3+5
3+5+6
3+5+6+7
3+5+6+7+8
3+5+6+7+8+9
3+6
3+6+7
3+6+7+8
3+6+7+8+9
3+7
3+7+8
3+7+8+9
3+8
3+8+9
3+9
4+5
4+5+6
4+5+6+7
4+5+6+7+8
4+5+6+7+8+9
4+6
4+6+7
4+6+7+8
4+6+7+8+9
4+7
4+7+8
4+7+8+9
4+8
4+8+9
4+9
5+6
5+6+7
5+6+7+8
5+6+7+8+9
5+7
5+7+8
5+7+8+9
5+8
5+8+9
5+9
6+7
6+7+8
6+7+8+9
6+8
6+8+9
6+9
7+8
7+8+9
7+9
8+9

最后筛选结果:
第0个结果:1+2+3=6
第1个结果:1+5=6
第2个结果:2+4=6

原文地址:https://www.cnblogs.com/guchunchao/p/11745193.html

时间: 2024-10-24 01:28:45

Java 集合、数组 任意个数数字相加等于一个指定的数的相关文章

程序员面试100题之十:快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值(转)

能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解. 假如有如下的两个数组,如图所示: 5,6,1,4,7,9,8 给定Sum= 10 1,5,6,7,8,9 给定Sum= 10 分析与解法 这个题目不是很难,也很容易理解.但是要得出高效率的解法,还是需要一番思考的. 解法一 一个直接的解法就是穷举:从数组中任意取出两个数字,计算两者之和是否为给定的数字. 显然其时间复杂度为N(N-1)/2即O(N^2).这个算法很简

求数组中两两相加等于20的组合(Python实现)

题目 求数组中两两相加等于20的组合. 例:给定一个数组[1, 7, 17, 2, 6, 3, 14],这个数组中满足条件的有两对:17+3=20, 6+14=20. 解析 分为两个步骤: 先采用堆排序或快速排序对数组进行排序,时间复杂度为O(nlogn). 然后对排序的数组分别从前到后和从后到前进行遍历, 时间复杂度为O(n). 假设从前到后遍历的下标为begin,从后到前遍历的下标为end. 当arr[begin] + arr[end] < 20时,满足条件的数一定在[begin+1, en

给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。

描述 给一个整数数组,找到两个数使得他们的和等于一个给定的数 target. 你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标.注意这里下标的范围是 0 到 n-1. 你可以假设只有一组答案. 样例 Example1: 给出 numbers = [2, 7, 11, 15], target = 9, 返回 [0, 1]. Example2: 给出 numbers = [15, 2, 7, 11], target = 9, 返回 [1, 2]. 1 /** 2 *

PHP 获取数组任意下标key的上一个prev和下一个next下标值

PHP 获取数组任意下标key的上一个prev和下一个next下标值 <?php $xoops[1] = '小'; $xoops[2] = '孩'; $xoops[3] = '子'; $xoops[4] = '气'; $steps = new Steps(); foreach($xoops as $key=>$value){ $steps->add($key); } $steps->setCurrent(3);//参数为key值 echo '上一个下标:'.$steps->g

有序数组中两个数的和等于一个输入值的函数

题目:        输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字.要求时间复杂度为O(N). 如果有多对数字的和等于输入的数字,输出任意一对即可. 例如输入数组1,2,4,7,11,15和数字15,由于4+11=15,因此输出4和11. 代码如下: /*data[] 为有序数组, length 为数组的长度 sum为用户输入的和 num1 为符合和等于sum的第一个数 num2 为第二个数*/ #include<iostream> using

Java之两个链表数字相加

给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和. 您可以假设除了数字 0 之外,这两个数都不会以 0 开头. 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 解决方案:1. 进位,以及进位数字的保存 /** * Definit

小程序-----可以计算任意个数数字的加、乘运算方法实现

1 public class Text1{ 2 public static void main(String args[]){ 3 System.out.println("和等于:"+add(2,5)); 4 System.out.println("和等于:"+add(2,5,100,25,23)); 5 System.out.println("和等于:"+add()); 6 System.out.println("乘等于:"

寻找二叉树的路径,使得路径和等于一个指定的整数

思路:递归思想 1 import java.util.ArrayList; 2 /** 3 public class TreeNode { 4 int val = 0; 5 TreeNode left = null; 6 TreeNode right = null; 7 8 public TreeNode(int val) { 9 this.val = val; 10 11 } 12 13 } 14 */ 15 public class Solution { 16 ArrayList<Array

删除数组中某一个指定的数

javascript原生写法: Array.prototype.indexOf = function(val){ for(var i=0;i<this.length;i++){ if(this[i] == val){ return i } } return -1; } Array.prototype.remove = function(val){ var index = this.indexOf(val); if(index >-1){ rerurn this.splice(index,1);