算法练习week12--leetcode179

Leetcode 179. Largest Number
题目:
Given a list of non negative integers, arrange them such that they form the largest number.

Example 1:

Input: [10,2]
Output: "210"
1
2
Example 2:

Input: [3,30,34,5,9]
Output: "9534330"
1
2
Note: The result may be very large, so you need to return a string instead of an integer.

解法:
这个题是一道排序的变形题,大概意思是让我们根据每个数字最后一位的大小排序,如果最后一位相同就比较前一位。

关于排序问题,我们可以使用c++标准库中的sort函数来直接解决,但是如何排序需要我们进行定义。

这里我们思考一个问题,如何比较两个简单字符串的大小,方法不外乎:

按照字典序
从右往左一位一位比较
这个题我们可以按照字典序进行处理,比如:19 , 11这两个数字,我们可以先把这两个数字转为字符串,然后用两种不同的顺序拼接起来,得到:

str1 = “1911”
str2 = “1119”
很显然," 1911 " > " 1119 " ,那么我们就可以把 19 排在 11 前面。

所以根据这个思路我们可以写出我们的排序函数:

sort(arr.begin(),arr.end(),cmp)//调用库函数,按照cmp函数的要求进行排序
bool cmp(string str1,string str2)
{
    string temp1 = str1 + str2 ;
    string temp2 = str2 + str1 ;
    return temp1 > temp2 ;
}


于此即可完成任务。

代码:

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        //使用匿名自定义函数
        sort(nums.begin(),nums.end(),[](int str1,int str2)
        {
            string temp1 = to_string(str1) + to_string(str2) ;
            string temp2 = to_string(str2) + to_string(str1);
            return temp1 > temp2 ;   
        });
        string test;
        for(int i = 0 ; i < nums.size() ; i ++ )
        {
            test += to_string(nums[i]) ;
        }
        //这里是为了处理全零的情况
        if(test[0] == '0')
        {
            return "0" ;
        }
        return test ;
    }
};


 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值