java 从数组取出指定数量的值,相加大于等于或小于等于指定的值,取出对应的组合下标,下标不能重复

Integer[] datas = new Integer[]{1,2,3,4,5,6,7,8,9,10,11};//目标数组
Integer min = 6;//大于等于的值
Integer max = 12;//小于等于的值
Integer count = 3;//指定数量

根据count如:3,3个数相加大于等于min小于等于max,2个数相加大于等于min小于等于max,1个数相加大于等于min小于等于max。
如果count=2,2个........,1ge.........。
返回List。

下面代码是我写死,我想知道怎样写活【count】

public static void main(String[] args) {
        Integer[] datas = new Integer[]{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19};
        Integer min = 6;
        Integer max = 12;
        Integer count = 3;
        List<Integer[]> test = test(datas, min, max, count);
        for(Integer[] integers : test){
            for(Integer t : integers){
                System.out.print("["+t+"]");
            }
            System.out.println("");
        }

    }
    public static List<Integer[]> test(Integer[] datas, Integer min, Integer max, Integer count){
        List<Integer[]> result = new ArrayList<>();
        switch (count){
            case 1:
                result.addAll(one(datas, min, max));
                break;
            case 2:
                result.addAll(one(datas, min, max));
                result.addAll(two(datas, min, max));
                break;
            case 3:
                result.addAll(one(datas, min, max));
                result.addAll(two(datas, min, max));
                result.addAll(three(datas, min, max));
                break;
        }
        return result;
    }

    public static List<Integer[]> one(Integer[] datas, Integer min, Integer max){
        List<Integer[]> result = new ArrayList<>();
        for(int i = 0,len = datas.length; i < len; i++){
            if(datas[i] >= min && datas[i] <= max){
                result.add(new Integer[]{i});
            }
        }
        return result;
    }

    public static List<Integer[]> two(Integer[] datas, Integer min, Integer max){
        List<Integer[]> result = new ArrayList<>();
        for(int i = 0,len = datas.length; i < len; i++){
            for(int j = 1 + i; j < len; j++){
                Integer num = datas[i] + datas[j];
                if(num >= min && num <= max){
                    result.add(new Integer[]{i,j});
                }
            }
        }
        return result;
    }

    public static List<Integer[]> three(Integer datas[], Integer min, Integer max){
        List<Integer[]> result = new ArrayList<>();
        for(int i = 0,len = datas.length; i < len; i++){
            for(int j = 1 + i; j < len; j++){
                for(int k = 1 + j; k < len; k++){
                    Integer num = datas[i] + datas[j] + datas[k];
                    if(num >= min && num <= max){
                        result.add(new Integer[]{i,j,k});
                    }
                }
            }
        }
        return result;
    }

输出的【下标】组合

[5]
[6]
[7]
[8]
[9]
[10]
[11]
[0][4]
[0][5]
[0][6]
[0][7]
[0][8]
[0][9]
[0][10]
[1][3]
[1][4]
[1][5]
[1][6]
[1][7]
[1][8]
[1][9]
[2][3]
[2][4]
[2][5]
[2][6]
[2][7]
[2][8]
[3][4]
[3][5]
[3][6]
[3][7]
[4][5]
[4][6]
[0][1][2]
[0][1][3]
[0][1][4]
[0][1][5]
[0][1][6]
[0][1][7]
[0][1][8]
[0][2][3]
[0][2][4]
[0][2][5]
[0][2][6]
[0][2][7]
[0][3][4]
[0][3][5]
[0][3][6]
[0][4][5]
[1][2][3]
[1][2][4]
[1][2][5]
[1][2][6]
[1][3][4]
[1][3][5]
[2][3][4]

dabocaiqq
请你们大家多多姿瓷我菠菜菌 data本身就是datum的复数,还datas,你的英文是美术老师教的?
9 个月之前 回复

3个回答

有2种方法第一种就是再开辟一个与datas相同长度的数组(datax)。这个数组里面都是二进制。假设datas的长度,datax长度为3
将datax从 000 001 010 011 100 101 110 111 只要末尾不断加1再不超过2
然后将datas的相应位置与datax的相应位置的数据相乘
若datas数据为 1 2 3 min -- 2 max --4 count -- 2
datax 000 001 010 011 100 101 110 111
sum 0 1*3 1*2 1*2+1*3 1*1 1*1+1*3 1*1+1*2 1*1+1*2+1*3
只要sum>=min&&sum<=max至于count只要在符合sum的前提下datax的1的个数<=count就行

另外一种是回溯法原理和上面类似





import java.util.ArrayList;
import java.util.List;

public class A {
    public static Integer[] datas = new Integer[]{1,2,3,4,5,6,7,8,9,10,11};
    public static Integer[] datasx = new Integer[datas.length];
    public static Integer y = 100;
    public static void main(String[] args) {

        Integer min = 6;
        Integer max = 12;
        Integer count = 3;
        List<List<Integer>> test = three(datas, min, max, count);


        for(List<Integer> list : test){
            for(Integer t:list){
                System.out.print("["+t+"]");
            }
            System.out.println();
        }


       // dox(32,min,max,3);

    }



    public static List<List<Integer>> three(Integer datas[], Integer min, Integer max,Integer count){
        List<Integer> result = new ArrayList<Integer>();
        List<List<Integer>> list  = new ArrayList<List<Integer>>();
        double b = (double)datas.length;
        Integer u = (int)Math.pow(2.0, b)-1;
        System.out.println("wjc"+u);
        int y = 0;
        while(y < u){
            y+=1;
            result = dox(y,min,max,count);
            if(result != null){
                list.add(result);
            }

        }
        return list;
    }
    private static List<Integer> dox(int parseInt,Integer min, Integer max,Integer count) {
        // TODO Auto-generated method stub

         List<Integer> result1 = new ArrayList<>();
         int sum = 0;
         int j = 0;
         int y = 0;
         int p;
         for(int i = 0;i<datasx.length;i++){
             datasx[i] = 0;
         }

         if(y>count){
             return null;
         }

         while(parseInt>0){
             p = parseInt%2;
             parseInt = parseInt/2;
             if(p == 1){
                 y++;
                 result1.add(datas.length-1-j);
             }
             datasx[j++] = p; 
         } 




         for(int i = datasx.length-1;i>=0;i--){
        //  System.out.print(datasx[i]);
             sum += datas[datas.length-1-i]*datasx[i];
         }
        //System.out.println();
        //System.out.println(sum);
         if(sum >= min && sum <=max){
             return result1;
         }
         return null;
    }

}


上面的代码是我说的第一种方法

qq_39181568
MY_MAIN 回复echo_wjcwjc: 看懂了,谢谢啦
9 个月之前 回复
qq_35654259
echo_wjcwjc 回复MY_MAIN: 全部解释太烦了
9 个月之前 回复
qq_35654259
echo_wjcwjc 回复MY_MAIN: 你哪里没看懂的。发下代码过来,我给你解释把
9 个月之前 回复
qq_35654259
echo_wjcwjc 回复MY_MAIN: 至于这个是啥算法。感觉像贪心
9 个月之前 回复
qq_35654259
echo_wjcwjc 回复MY_MAIN: 这个是我老早以前,好像看一本<<妙趣横生的算法>>里面学的。其实这个算法时间复杂度有点高。你要学算法的话可以看一下小甲鱼的数据结构然后去杭电hdu里面或者蓝桥杯里面做题。
9 个月之前 回复
qq_39181568
MY_MAIN 哦,看懂了,好神奇,datax里的二进制中 000;001;010。。。都是每个组合,把满足组合的放进list就可以了6666666666666
9 个月之前 回复
qq_39181568
MY_MAIN 大佬六啊,能告诉我你用的什么算法吗,= - =有些地方没看懂,我准备网上搜搜看
9 个月之前 回复

这是我的答案:你看看满足你的要求不:

Integer[] datas = new Integer[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};// 目标数组
        Integer min = 6;// 大于等于的值
        Integer max = 12;// 小于等于的值
        Integer count = 3;// 指定数量
        // 遍历cont为1
        for (int i = 0; i < datas.length; i++) {
            if (min<=datas[i]&&datas[i]<=max) {
                System.out.println(i);
            }
        }
        // count 为2 时候
        for (int i = 0; i < datas.length; i++) {
            for (int j = i+1; j < datas.length; j++) {
                int sum2=datas[i]+datas[j];
                if (min<=sum2&&sum2<=max) {
                    System.out.println("第一个下标为:"+i+"第二个下标为:"+j);
                }

            }

        }
    // count 为3的时候
        for (int i = 0; i < datas.length; i++) {
            for (int j = i+1; j < datas.length; j++) {
                for (int k = j+1; k < datas.length; k++) {

                    int sum3=datas[i]+datas[j]+datas[k];
                    if (min<=sum3&&sum3<=max) {
                        System.out.println("第一个下标为:"+i+"第二个下标为:"+j+"第三个下标是:"+k);
                    }
                }

            }

        }

我明白你的想法,但是这样的算法是不行的,试想一下如果count是10,那你不是要写10个for循环来算10个数的和,并没有“写活”count让他自动就有10次for的方法(至少我没想到)。这道题应该是用搜索来做,个人感觉用深度搜素应该可以满足要求。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
悬赏一下了,请问Java语言int和Integer结果相加,返回的是什么?
-
数组内的值与显示的不一样
-
将a数组中的数依次取出分别与b数组中的数挨个相加得到新的数组再输出新数组的和
-
有一个数组,数组里任意个数数字相加等于一固定数值,求出所有可能性的任意数字组合?
-
mysql如何查询某字段里两个值相加结果等于已知道的一个数字
-
求一个int数组的元素相加为某值的所有组合,获得组合中元素的下标
-
小白想问一下汇编语言的数组如何定义和访问?
-
关于C++无符号数跟有符号数相加的问题
-
连vb6.0中怎么实现不同区间的数组下标构成的数组的相加操作,怎么把两个不同长度的数组相加
-
如何用java8stream实现多个对象中相同的字段值相加?最后得到一个对象
-
java中把两个维数相同的矩阵对应的元素相加得到新的矩阵的代码
-
小程序怎么获取两个view的高度,然后相加 求大佬帮忙
-
java 使用LinkedList 实现多项式的相加相乘
-
求一个字符串中出现次数最多的数字之和?
-
求一个数组中选出任意个数元素相加之和,求大神指教
-
求一组int类型数组中,任意数相加等于一个定值的高性能算法
-
java 算法问题,求double集合里,值相加无限接近100的,最少有多少个?
-
R语言中如何对含有10000个matrix的list进行统一操作,对每个matrix中每3行相加?
-
请教将一个列表中字典字段相同的元素合并并且值相加,有什么好的办法吗?
-
程序员实用工具网站
目录 1、搜索引擎 2、PPT 3、图片操作 4、文件共享 5、应届生招聘 6、程序员面试题库 7、办公、开发软件 8、高清图片、视频素材网站 9、项目开源 10、在线工具宝典大全 程序员开发需要具备良好的信息检索能力,为了备忘(收藏夹真是满了),将开发过程中常用的网站进行整理。 1、搜索引擎 1.1、秘迹搜索 一款无敌有良心、无敌安全的搜索引擎,不会收集私人信息,保...
我花了一夜用数据结构给女朋友写个H5走迷宫游戏
起因 又到深夜了,我按照以往在csdn和公众号写着数据结构!这占用了我大量的时间!我的超越妹妹严重缺乏陪伴而 怨气满满! 而女朋友时常埋怨,认为数据结构这么抽象难懂的东西没啥作用,常会问道:天天写这玩意,有啥作用。而我答道:能干事情多了,比如写个迷宫小游戏啥的! 当我码完字准备睡觉时:写不好别睡觉! 分析 如果用数据结构与算法造出东西来呢? ...
别再翻了,面试二叉树看这 11 个就够了~
写在前边 数据结构与算法: 不知道你有没有这种困惑,虽然刷了很多算法题,当我去面试的时候,面试官让你手写一个算法,可能你对此算法很熟悉,知道实现思路,但是总是不知道该在什么地方写,而且很多边界条件想不全面,一紧张,代码写的乱七八糟。如果遇到没有做过的算法题,思路也不知道从何寻找。面试吃了亏之后,我就慢慢的做出总结,开始分类的把数据结构所有的题型和解题思路每周刷题做出的系统性总结写在了 Github...
Java泛型 通配符详解
对于<? super 类型>,编译器将只允许写操作,不允许读操作。即只可以设值(比如set操作),不可以取值(比如get操作)。 对于<? extends 类型>,编译器将只允许读操作,不允许写操作。即只可以取值,不可以设值。 以上两点都是针对于源码里涉及到了类型参数的函数而言的。比如对于List而言,不允许的写操作有add函数,因为它的函数签名是boolean add(E e);,此时这个形参E就变成了一个涉及了通配符的类型;而不允许的读操作有get函数,因为它的函数签名是E get(int index)
代码整洁 vs 代码肮脏
写出整洁的代码,是每个程序员的追求。《clean code》指出,要想写出好的代码,首先得知道什么是肮脏代码、什么是整洁代码;然后通过大量的刻意练习,才能真正写出整洁的代码。 WTF/min是衡量代码质量的唯一标准,Uncle Bob在书中称糟糕的代码为沼泽(wading),这只突出了我们是糟糕代码的受害者。国内有一个更适合的词汇:屎山,虽然不是很文雅但是更加客观,程序员既是受害者也是加害者。 对...
让程序员崩溃的瞬间(非程序员勿入)
今天给大家带来点快乐,程序员才能看懂。 来源:https://zhuanlan.zhihu.com/p/47066521 1. 公司实习生找 Bug 2.在调试时,将断点设置在错误的位置 3.当我有一个很棒的调试想法时 4.偶然间看到自己多年前写的代码 5.当我第一次启动我的单元测试时 ...
接私活必备的 10 个开源项目!
点击蓝色“GitHubDaily”关注我加个“星标”,每天下午 18:35,带你逛 GitHub!作者 | SevDot来源 | http://1t.click/VE8W...
阿里资深工程师教你如何优化 Java 代码!
作者 | 王超 责编 | 伍杏玲 明代王阳明先生在《传习录》谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层。着实用功,便见道无终穷,愈探愈深,必使精白无一毫不彻方可。 代码中的"坏味道",如"私欲"如"灰尘",每天都在增加,一日不去清除,便会越累越多。如果用功去清除这些"坏味道",不仅能提高自己的编码水平,也能使代码变得"精白无一毫不彻"。这里,整理了日常工作中的一...
周杰伦新歌《说好不哭》上线,程序员哭了......
欢迎添加华为云小助手微信(微信号:HWCloud002或HWCloud003),输入关键字“加群”,加入华为云线上技术讨论群;输入关键字“最新活动”,获取华为云最新特惠促销。华为云诸多技术大咖、特惠活动等你来撩! 前些天,场主的朋友圈被一首歌刷屏了。 数据有多牛逼?除了揽获各大新闻头条,新歌发售3小时,数字专辑就在QQ音乐卖了360万张。以单价3元计算,一首《说好不哭》已狂揽千万...
GitHub开源的10个超棒后台管理面板
目录 1、AdminLTE 2、vue-Element-Admin 3、tabler 4、Gentelella 5、ng2-admin 6、ant-design-pro 7、blur-admin 8、iview-admin 9、material-dashboard 10、layui 项目开发中后台管理平台必不可少,但是从零搭建一套多样化后台管理并不容易,目前有许多开源、免费、...
Java中创建对象的5种方法
将会列举5种方法去创建 Java 对象,以及他们如何与构造函数交互,并且会有介绍如何去使用这些方法的示例。 作为一个 Java 开发人员,我们每天都会创建大量的 Java 对象,但是我们通常会使用依赖管理系统去创建这些对象,例如 Spring 。然而,我们可以有更多的方式去创建对象,让我们一起在文章中去学习这些方法吧。 这里列举在 Java 中创建对象的五种方式,下面将介绍它们的示例,以及创建对象...
100 个网络基础知识普及,看完成半个网络高手
欢迎添加华为云小助手微信(微信号:HWCloud002或HWCloud003),输入关键字“加群”,加入华为云线上技术讨论群;输入关键字“最新活动”,获取华为云最新特惠促销。华为云诸多技术大咖、特惠活动等你来撩! 1)什么是链接? 链接是指两个设备之间的连接。它包括用于一个设备能够与另一个设备通信的电缆类型和协议。 2)OSI 参考模型的层次是什么? 有 7 个 OSI 层:物理...
动画:面试如何轻松手写链表?
写在前边 暑假参加的第一个公司的就让我手写一个双向链表,并完成插入数据和删除数据的操作。当时我很蒙蔽,懵逼的不是思路,而是手写,虽然写出来了,但是很多边界条件和代码规范自我感觉不好,所以有了这些细心的总结。那么今天的主题就是徒手写链表,应聘者该如何下手? 我们通常写链表准备应聘的时候,通常背加上理解,但是过了几天又让你写。就会陌生了,虽然有点思路。还是模模糊糊,小鹿也有这个记性的“毛病”,“有毛病...
栈和队列:面试题(Java)
两个队列实现一个栈 使用两个队列完成栈的功能, 思路: 如上图,入队顺序为:1 2 3 4 5,如果要模拟栈的功能,那么就要上5先弹出来,因为是队列,所以只能从1开始出,把1 2 3 4存到另外一个队列中,这样就可以把5弹出来了: 这样就完成了一次出栈,这下上面的队列为空,所有的数据存储在下面这个队列中: 如果要继续出栈,那么就把1 2 3 挪到空的队列中,弹出4,到这里已经明白了如何模拟出...
Google离开我们快十年了
2010年1月13日,Google离开中国。掐指算来,Google已经离开我们快十年了。2010年是个特殊的年份,这一年还发生了3Q大战。为什么诸多大事都发生在2010年...
中国最顶级的一批程序员,从首富到首负!
过去的20年是程序员快意恩仇的江湖时代通过代码,实现梦想和财富有人痴迷于技术,做出一夜成名的产品有人将技术变现,创办企业成功上市这些早一代的程序员们创造的奇迹引发了一浪高...
为什么面向对象糟透了?
又是周末,编程语言“三巨头”Java, Lisp 和C语言在Hello World咖啡馆聚会。服务员送来咖啡的同时还带来了一张今天的报纸, 三人寒暄了几句, C语言翻开了...
分享靠写代码赚钱的一些门路
作者 mezod,译者 josephchang10如今,通过自己的代码去赚钱变得越来越简单,不过对很多人来说依然还是很难,因为他们不知道有哪些门路。今天给大家分享一个精彩...
对计算机专业来说学历真的重要吗?
我本科学校是渣渣二本,研究生学校是985,现在毕业五年,校招笔试、面试,社招面试参加了两年了,就我个人的经历来说下这个问题。 这篇文章很长,但绝对是精华,相信我,读完以后,你会知道学历不好的解决方案,记得帮我点赞哦。 先说结论,无论赞不赞同,它本质就是这样:对于技术类工作而言,学历五年以内非常重要,但有办法弥补。五年以后,不重要。 目录: 张雪峰讲述的事实 我看到的事实 为什么会这样 ...
程序员该如何把 Windows 系统打造的跟 Mac 一样牛逼?
起因:之前一直用Mac开发,换了家公司,只许用Windows下开发,说实话,一开始我是拒绝的,可自从看到了这几个工具以后......1、终端工具:item2 VS Cmd...
技术人员要拿百万年薪,必须要经历这9个段位
很多人都问,技术人员如何成长,每个阶段又是怎样的,如何才能走出当前的迷茫,实现自我的突破。所以我结合我自己10多年的从业经验,总结了技术人员成长的9个段位,希望对大家的职...
相关热词 c#可被js调用的函数 c# 日志文件 c# mvc中间件 c#爬虫路径中文件名过长 c# mutex 延时 c# mysql 功能码 c# 多态 封装 c# 校园一卡通接口 c#本地帮助文档 c#两个table左联接

相似问题

4
c++ 运行发生malloc(): memory corruption(fast)
3
在一个无序的数组中,实现一个或者多个元素相加小于给定的目标数,所有的可能。
3
如何用java8stream实现多个对象中相同的字段值相加?最后得到一个对象
3
java数据结构算法问题,几个数相加得到满足条件的最小和
6
求一组int类型数组中,任意数相加等于一个定值的高性能算法
6
怎么将数据库的字段查出来后相加
10
javascript两个数组合并,不是连接,而是相加
12
javascpt怎么将两个数组的结果相加,得到一个新的数组呢,非要循环实现么?不用循环怎么写?
2
请问如何使用javascript的map语句实现不定多个数组的相加?相加怎么用map实现?
8
javascript怎么实现两个数组中随机两个相加?相加的结果用alet方式进行输出?
2
jacascrup怎么对不同类型的字符串进行相加操作,字符串数组的相加怎么加?
1
Digital Roots 题目大意将输入的正整数的各个数相加
1
通过java将Mongdodb数据相加并得出每个值平均值
2
通过java将Mongdodb中相同字段不同数据相加并得出每个值平均值
1
算法题 - 输出数组中数字两两相加的所有结果,要求时间复杂度o(n)
1
python使用pandas两数组相加
3
帮帮可怜热情的孩子吧 我做了半天总不行 可以微信红包(A1426237670) 谢谢你们啊 要哭了......
1
计算求出一个数字自身相加等于自身的数字,这个应该用递归怎么实现?
0
Redis中怎么不同目录下面的值一次取出来,计算总数
1
如何在C++中用重载让两个数组相加?