给定n个整数,得到n个数拼成的最大值和最小值

解题思路:

       自定义一种字符串的比较规则:即如果A+B>B+A,则我们认为A>B。且可以证明:如果A+B>=B+A,B+C>=C+B,则一定有:A+C>=C+A。    

      分3步,先把n个数字转换成字符串存储;

      再按照自定义的规则把n个字符串排序;

      最后按照从小到大的顺序输出这些字符串(如果从大到小则是求最大的多位整数)。

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

//自定义判断字符串大小的函数
bool Compare_min(const string& s1, const string& s2)
{
    string ss1 = s1+s2;
    string ss2 = s2+s1;

    return ss1 < ss2;
}

//判断拼接的小数字
string Min_number(vector nums)
{
    vector nmstr;
    string res;

    if(nums.empty())
    {
        return " ";
    }

    //把数组转换为字符串
    for(int i = 0; i < nums.size(); i++)
    {
        //定义一个字符串流来加载数组值
        stringstream s;
        s << nums[i]; //加载数组里的值
        string tmp;
        s >> tmp;  //转换为字符串
        nmstr.push_back(tmp);
    }

    if(Compare_min)
    {
        //从小到大排是最小的数字
        sort(nmstr.begin(),nmstr.end());
    }

    //两两比较后不断加上后边的字符数组
    for(int i = 0; i < nmstr.size(); i++)
    {
        res += nmstr[i];
    }

    return res;
}


//自定义比较大小
bool Compare_max(const string& s1, const string& s2)
{
    string ss1 = s1+s2;
    string ss2 = s2+s1;

    return ss1 >= ss2;
}

//判断拼接的大数字
string Max_number(vector nums)
{
    vector nmstr;
    string res;

    if(nums.empty())
    {
        return " ";
    }

    for(int i = 0; i < nums.size(); i++)
    {
        stringstream s;
        s << nums[i];
        string tmp;
        s >> tmp;
        nmstr.push_back(tmp);
    }


    sort(nmstr.begin(),nmstr.end(),Compare_max);


    for(int i = 0; i < nums.size(); i++)
    {
        res += nums[i];
    }

    return res;
}

int main()
{
    int n;
    cin >> n;

    vector nums(n);

    for(int i = 0; i < n; i++)
    {
        cin >> nums[i];
    }

    cout << "最小的数字是" << Min_number(nums) << endl;
    cout << "最大的数字是" << Max_number(nums) << endl;

    return 0;
}


 

你可能感兴趣的:(面试复习)