没有考虑异常输入的你,总有一天会急死。

时间:2021-05-16 19:20:07

题目描述

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

对应每个测试案例,输出两个数,小的先输出。

分析:段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起

急死我了,原来是::

没有考虑异常输入!!!如果给的数组为空,那么你访问,必然就是上个原因了。


异常输入:

如果输入为空数组,你访问某个值,就是非法访问数组。


一直都在提醒:

检查指针是否为空,数组为空,特殊输入测试,不然自己都不知道怎么死的。


此题有个技巧:

1*19<2*18<3*17<.....<10*10 所以第一对就是乘积最小的。

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int> res;
        if(array.size()<2) return res;//没有这句话,老是说我非法访问数组,老子要急死了。
        int begin=0,end=array.size()-1;
        long long  minproduct=INT_MAX;
        int final_begin=begin,final_end=end;
        while(begin<end){
            int tmpsum=array[begin]+array[end];
            if(tmpsum>sum)
                end--;
            else if(tmpsum<sum)
                begin++;
            else{
                if(array[begin]*array[end]<minproduct){
                    minproduct=array[begin]*array[end];
                    final_begin=begin;final_end=end;
                }
                begin++;
                end--;
            }
        }
        if(array[final_begin]+array[final_end]!=sum)
            return res;
        else{
            res.push_back(array[final_begin]);
            res.push_back(array[final_end]);
        }
        return res;

    }
};



class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        int begin=0,end=array.size()-1;
        int minproduct=INT_MAX;
        int final_begin=begin,final_end=end;
        vector<int> res;
        while(begin<end){
            int tmpsum=array[begin]+array[end];
            if(tmpsum>sum)
                end--;
            else if(tmpsum<sum)
                begin++;
            else{
                 res.push_back(array[begin]);
                res.push_back(array[end]);
               break;
                
            }
        }

        
       
        return res;


    }
};