题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
思路: 数组任意2个坐标相加,和等于s就加入list列表,由于要乘积最小,所以要对结果集lists进行排序,用Collections工具类,当然也可以自己写个排序算法来进行排序。
代码:
package net.stxy.one.controller; import java.util.*; /** * Created by ASUS on 2018/6/7 * * @Authod Grey Wolf */ public class Test1 { public static void main(String[] args) { Test1 test1=new Test1(); test1.sys(); } private void sys() { int []arr={1,2,3,4,5,6,7,8,9}; int s=10; ArrayList<Integer>list=findResult(arr,s); System.out.println("输出结果:"); for (Integer num:list){ System.out.print(num+" "); } } private ArrayList<Integer> findResult(int[] arr, int s) { ArrayList<ArrayList<Integer>>lists=new ArrayList<>(); int i,j; int len=arr.length; for (i=0;i<len-1;i++){ ArrayList<Integer>list=new ArrayList<>(); for (j=i+1;j<len;j++){ if(arr[i]+arr[j]==s){ list.add(arr[i]); list.add(arr[j]); list.add(arr[i]*arr[j]); } } //如果list有数就加入lists if (!list.isEmpty()){ lists.add(list); } } //如果没有记录 if(lists.size()==0){ return new ArrayList<>(); } //对lists进行排序,由2个数的乘积进行排序,由小到大。 Collections.sort(lists,new Comparator<ArrayList<Integer>>(){ @Override public int compare(ArrayList<Integer> o1, ArrayList<Integer> o2) { return o1.get(2).compareTo(o2.get(2)); } }); //输出lists列表,看看有哪些数字和为s; System.out.println("查看有哪2个数字和为s:"); for(ArrayList<Integer>list1:lists){ for (Integer num:list1){ System.out.print(num+" "); } System.out.println(); } //排序后第一个乘积最小 ArrayList<Integer>temp=lists.get(0); ArrayList<Integer>result=new ArrayList<>(); //因为我只要2个数,不需要它们的乘积 for (i=0;i<2;i++){ result.add(temp.get(i)); } return result; } }
效果:
查看有哪2个数字和为s:
1 9 9
2 8 16
3 7 21
4 6 24
输出结果:
1 9
我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。