和为s的两个数字算法实现(可直接运行)

题目:控制台输入一组无序数组和一个数字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;
	}
	
	}

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值