编程题:和为s的两个数字

题目描述

输入一个递增排序的数组和一个数字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

我的座右铭:不会,我可以学;落后,我可以追赶;跌倒,我可以站起来;我一定行。


猜你喜欢

转载自blog.csdn.net/weixin_39220472/article/details/80610794