题目:控制台输入一组无序数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路:先对数组进行冒泡升序排列,将满足和为S的两个数字存在hashmap中,由数学知识可知,和相同的几对值,相差越大乘积越小(如1和14,5和10,和都为15但是1乘14小于5乘以10)。故存入hashmap的第一组数即是结果.代码如下
package offerPractical;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
public class Solution {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("请输入一组数组,用“,”断开:");
Scanner in = new Scanner(System.in);
String str = in.next();
//对输入的字符串进行转化,转化为整形数组。
String[] emmer = str.split(",");
int[] sum = new int[emmer.length];
for (int i = 0; i < emmer.length; i++) {
// sum[i] =Integer.parseInt(emmer[i]);
sum[i] = Integer.parseInt(emmer[i]);
}
//对整形数组进行冒泡排序(升序)
// Arrays.sort(sum);
for (int i = 0; i < sum.length - 1; i++) {
for (int j = 0; j < sum.length - i - 1; j++) {
if (sum[j] > sum[j + 1]) {
int temp = sum[j];
sum[j] = sum[j + 1];
sum[j + 1] = temp;
}
}
}
System.out.println("请输入S:");
Scanner sc= new Scanner(System.in);
int s=sc.nextInt();
//计算加起来等于S的两个数字,并将其存储到hashmap中
HashMap<Integer, Integer> stack=new HashMap<>();
for (int i = 0; i < sum.length-1; i++) {
for (int j = i+1; j <=sum.length-1; j++) {
if ((sum[i]+sum[j])==s) {
stack.put(sum[i], sum[j]);
//System.out.println(sum[i]*sum[j]);
}
}
}
//hashmap输出迭代,键值对差值越大,乘积越小,故第一个存进hashmap的键值对是最小的。
Iterator iterator= stack.entrySet().iterator();
int i =1;
while (iterator.hasNext()) {
Map.Entry entry = (Map.Entry) iterator.next();
Object key = entry.getKey();
Object value = entry.getValue();
System.out.println(key + ":" + value);
int k=Integer.parseInt(String.valueOf(key));
int v=Integer.parseInt(String.valueOf(value));
if (i==1) {
System.out.println("键值对差值越大,乘积越小,故第一个存进hashmap的键值对是最小的,两个数分别为"+key + ":" + value+"乘积为:"+k*v);
}
++i;
}
}
}