首页 > 试题广场 >

数字查找

[编程题]数字查找
  • 热度指数:304 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度为n的数组a[0],a[1]...a[n-1]和一个数字x,在数组中查找两个数a和b(可以是相同的值,但是不可以是相同位置的数字),使得它们的和与输入的数字差的绝对值最小。
比如:
a = [8,3,6,1]      x=13
那么答案为:6和8

输入描述:
第一行两个数字 n,x(2<=n<=1000,1<=x<=108
第二行n个用空格隔开的数字a[0],a[1]...a[n-1]


输出描述:
两个数字a,b,用空格隔开。比较小的数字在左边,即输出要保证a<=b
示例1

输入

4 13
8 3 6 1

输出

6 8
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.StringTokenizer;
 
public class Main {
    static int[] array1;
    public static void main(String[] args) {
        //输入两个数  数组大小n  要比较的数x
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int x = sc.nextInt();
 
        //数组array1
        if (2 <= n && n <= 1000 && 1 <= x && x <= 10E8) {
            array1 = new int[n];
            for (int i = 0; i < n; i++) {
                int b = sc.nextInt();
                array1[i] = b;
            }
 
            //结果放进map
            Map map = new HashMap();
            int c;
            int e=1000000;
            for (int i = 0; i < n; i++) {
                for (int j = 1; j < n; j++) {
                    //去重
                    if (i == j || i > j) {
                        continue;
                    }
                    c = Math.abs(array1[i] + array1[j]- x);
 
                    map.put(c, Math.min(array1[i],array1[j]) + "," +Math.max(array1[i],array1[j]) );
                    e = Math.min(e, c);
                }
            }
 
//            System.err.println("最小绝对值"+e);
            StringTokenizer splitor = new StringTokenizer((String) map.get(e),",");
            while(splitor.hasMoreTokens()){
                System.out.print(splitor.nextElement()+" ");
            }
        }
    }
}

发表于 2020-02-19 19:40:38 回复(0)