zoukankan      html  css  js  c++  java
  • 一道算法题

    题目描述

    输入一个递增排序的数组和一个数字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);
            }
        }
    }
  • 相关阅读:
    解决ORA01502 state unusable错误成因
    Remoting.Corba
    NHibernate 处理 oracle 的long数据类型
    NET下连接SYBASE数据库
    JavaScript 的变量作用域及闭包
    PowerDesigner的样式设置
    NHibernate学习 (转)
    性能调优:数据库设计规范化的五个要求
    利用 ADO.NET 连接到 Informix(转)
    sqlnet.expire_time
  • 原文地址:https://www.cnblogs.com/a294098789/p/5350984.html
Copyright © 2011-2022 走看看