• 一道算法题


    题目描述

    输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

    输入:

    每个测试案例包括两行:
    第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 <= n <= 10^6,k为int
    第二行包含n个整数,每个数组均为int类型。

    输出:

    对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”

    样例输入:

    6 15
    1 2 4 7 11 15

    样例输出:

    4 11


    package com.csdhsm.algorithm;
    
    import java.util.ArrayList;
    import java.util.List;
    import java.util.Scanner;
    
    /** 
     * @Title: Test001.java
     * @Package: com.csdhsm.Algorithm
     * @Description 
     * @author Han
     * @date 2016-4-3 下午9:41:41 
     * @version V1.0
     */ 
          
    /**************************************************************************************************** 
    题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。 
    要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。 
    例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。 
    输入:
    每个测试案例包括两行:
    第一行包含一个整数n和k,n表示数组中的元素个数,k表示两数之和。其中1 <= n <= 10^6,k为int
    第二行包含n个整数,每个数组均为int类型。
    输出:
    对应每个测试案例,输出两个数,小的先输出。如果找不到,则输出“-1 -1”
    样例输入:
    6 15
    1 2 4 7 11 15
    *****************************************************************************************************/  
    
    public class Test001 {
        
        private static Scanner scanner = new Scanner(System.in);
    
         
        /** 
         * @Description 得到相加为k的两个数字
         * @author Han
         * @param list 输入的数组
         * @param n 数组个数
         * @param k  相加之和
         */
              
        private static List<Integer> getTheTwoNumber(List<Integer> list, int n, int k) {
            
            int low = 0;
            int high = n-1;
            
            if(n<2){
                
                System.out.println("数组个数小于2");
                
                return null;
            }
            
            List<Integer> result = new ArrayList<Integer>();
            
            //当low == high时,表示该数组内没有两个相加为k的数
            while(low < high){
                
                //结果成立,返回
                if((list.get(low) + list.get(high)) == k){
                    
                    result.add(list.get(low));
                    result.add(list.get(high));
                    
                    return result;
                }
                
                //结果小于k,则表示需要更大的数字,则为low ++ ,相反则表示需要更小的数字,为high --
                if((list.get(low) + list.get(high))<k){
                    
                    low ++;
                }else{
                    
                    high --;
                }
            }
            
            result.add(-1);
            result.add(-1);
            return result;
        }
        
        public static void main(String[] args) {
            
            int n;//数组中的元素个数
            int k;//表示两数之和
            
            System.out.println("请输入数组的个数");
            
            //输入数组个数
            if(scanner.hasNextInt()){
                
                n = scanner.nextInt();
                if(n<=0){
                    
                    System.out.println("数组个数必须大于0");
                    return;
                }
            }else{
                
                System.out.println("请输入一个整数");
                return;
            }
            
            System.out.println("请输入两数之和");
            
            //输入两数之和
            if(scanner.hasNextInt()){
                
                k = scanner.nextInt();
            }else{
                
                System.out.println("请输入一个整数");
                return;
            }
            
            System.out.println("请输入" + n + "个升序数字");
            
            List<Integer> list = new ArrayList<Integer>();  
            
            //输入一个升序数组
            for(int i=0;i<n;i++){
                
                System.out.println("请输入第" + (i+1) + "个数字");
                if(scanner.hasNextInt()){
                    
                    int temp = scanner.nextInt();
                    
                    if(i!=0){
                        
                        //输入的不是一个升序数组
                        if(temp < list.get(i-1)){
                            
                            System.out.println("请输入升序数组");
                            i--;
                        }else{
                            
                            System.out.println("输入成功");
                            list.add(temp);
                        }
                    }else{
                        
                        //第一次输入,不需要判断
                        System.out.println("输入成功");
                        list.add(temp);
                    }
                }else{
                    
                    System.out.println("输入错误,请重新输入!");
                    i--;
                }
            }
            
            List<Integer> _list = getTheTwoNumber(list,n,k);
            
            if(_list != null){
    
                System.out.println(_list);
            }
        }
    }
  • 相关阅读:
    常用集体名词的用法
    囊中羞涩的表达
    《当幸福来敲门》观后感
    <肖申克的救赎>观后感
    心语4
    补充:回答网友的问题,如何不用路径,而直接将CImage画到DC中,之后DC一起显示.
    线程中对变量的用法
    添加按键变量数组,就是很多同种类型按键关联变量,这些变量是一个数组;
    不容按钮、下拉框 执行同一个函数或者同一种函数的用法
    CImage显示位图与CDC双缓冲冲突,使用路径层解决.
  • 原文地址:https://www.cnblogs.com/a294098789/p/5350984.html
Copyright © 2020-2023  润新知