编程练习
题目:输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:对应每个测试案例,输出两个数,小的先输出。
思路:看似简单但稍许有些复杂的题,难点在于后面的判断符合条件的结果集中乘积最小的结果集的判断。首先求出数组中满足两个数组元素相加等于sum的所有元素对,用ArrayList盛装它们,利用两层for循环即可解决。接着需要求出,如果有多个满足条件的元素对,求出它们中乘积最小的那个作为返回值返回。我采用了将结果集装入一个ArrayList中并命名为reslist,并求出它们的每一对的乘积,再放入另一个叫做minlist的ArrayList中,这样可以保证这两个ArrayList对应的下标是一致的。然后借助一个辅助的cpList将minlist复制并排好序,取得其中的最小值m,然后再在minlist中找到这个最小值m对应的下标值,即是结果集reslist中对应下标处的结果,取出来返回即可。
注意:需要考虑没有符合条件的元素时的特殊情况的处理。
java代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41import java.util.ArrayList;
public class FindNumbersWithSum {
public static ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<ArrayList<Integer>> reslist=new ArrayList<ArrayList<Integer>>();
for(int i=0;i<array.length-1;i++) {
for(int j=i+1;j<array.length;j++) {
if(array[i]+array[j]==sum) {
ArrayList<Integer> res=new ArrayList<Integer>();
res.add(array[i]);
res.add(array[j]);
reslist.add(res);
}
}
}
//如果数组中没有符合条件的值则返回一个空的结果集
if(reslist.size()==0) {
return new ArrayList<Integer>();
}
//计算结果集中每个res中两个数乘积的值
ArrayList<Integer> minlist=new ArrayList<Integer>();
for(int i=0;i<reslist.size();i++) {
int min=reslist.get(i).get(0)*reslist.get(i).get(1);
minlist.add(min);
}
//利用cplist进行复制并排序得到乘积最小的min
ArrayList<Integer> cplist=new ArrayList<Integer>();
for(int c:minlist) {
cplist.add(c);
}
cplist.sort(null);
//返回乘积最小的min在minlist中的位置,也就是结果集reslist中需要输出的那个位置的res
int m=minlist.indexOf(cplist.get(0));
return reslist.get(m);
}
public static void main(String[] args) {
int [] array= {1,2,3,5,6,7,9};
int sum=18;
System.out.println(FindNumbersWithSum(array,19));
}
}