Java 基础算法 短板问题 : 你正在使用一堆木板建造跳水板。有两种类型的木板,其中长度较短的木板长度为shorter,长度较长的木板长度为longer, 你必须正好使用 k 块

it2024-07-16  40

题目

你正在使用一堆木板建造跳水板。

有两种类型的木板,其中长度较短的木板长度为 shorter ,长度较长的木板长度为 longer 。你必须正好使用 k 块木板。编写一个方法,生成跳水板所有可能的长度。返回的长度需要从小到大排列。代码如下:

主函数代码 :

public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.print("请输入短板长度"); int shorter = sc.nextInt(); System.out.print("请输入长板长度"); int longer = sc.nextInt(); System.out.print("请输入使用木板数量"); int k = sc.nextInt(); System.out.println("方法1"+num(shorter,longer,k)); System.out.println("方法2"+number(shorter,longer,k)); sc.close(); }

方法一 :

思路: 将短板的数量设置为 i , 则长板的数量为 k - i , 则跳板的长度的算式为: i*shorter+(k-i)*longer , 将其写入循环每次减少一个短板增加一个长板.将所有可能的长度排序输出. public static List<Integer> num(int shorter,int longer,int k){ //存放跳水板所有可能长度 List<Integer> len = new ArrayList<Integer>(); //输入数量为0,直接返回null if(k==0) { return null; } //当长板和短板长度一样时,只有一种长度可能 if(shorter == longer) { len.add(shorter*k); }else { //i,(k-i)分别代表长板和短板的数量 for(int i=k;i>=0;i--) { len.add(i*shorter+(k-i)*longer); } //集合进行排序 Collections.sort(len); } return len; }

方法二

思路: 长板与短板之间的差值为longer-shorter , 先假设有 K 个短板,然后每次循环在短板上,加上差值的长度, 加上的 i 个差值就是有了 i 个长板. 总长度为 : shorterk + difi 之后将结果排序输出. public static List<Integer> number(int shorter,int longer,int k) { //存放跳水板所有可能长度 List<Integer> len = new ArrayList<Integer>(); if(k==0) { return null; } if(shorter == longer) { len.add(shorter*k); }else { //dif : 表示长短板之间的长度差 int dif = longer - shorter; //从全部是短板开始,循环直接到全部是长板 for(int i=0;i<=k;i++) { //依次增加一个短板和长板的差值 len.add(shorter*k + dif*i); } //集合进行排序 Collections.sort(len); } return len; }
如有错误请各位大神指导,叩谢了
最新回复(0)