leetcode-179-Largest Number(理解规则,自定义cmp函数进行排序)
题目描述:
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。
示例 1:
输入:[10,2]
输出:210
示例 2:
输入:[3,30,34,5,9]
输出:9534330
说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。
要完成的函数:
string largestNumber(vector<int>& nums)
说明:
1、这道题给定一个vector,里面存放着int类型的非负整数,要求把这些非负整数拼起来,尽可能拼成一个最大的整数。
比如[10,2],可以拼成102,也可以拼成210,最大的整数就是210,那么返回210,以字符串的形式。
2、这道题关键在于判断,判断vector中的两个数谁大谁小,谁应该放在前面。
举个例子,比如[3,30,31,32,33,34,35,102,9,990],大家觉得应该怎么排序?
我们要尽可能让大的数字放在前面,所以首位肯定要放个大一点的,那么就是9了,其余的都是3,放在首位不合适。
那么9有两个,要放9还是990,这里要对这两个数的组合做个判断。
一种是9990,一种是9909,所以还是9-990这种组合。
那么接下来呢,9-990之后呢?3跟30比,一种是330,一种是303,所以还是3在30前面。
那3跟31比呢,一种是331,一种是313,还是3在31前面。
是不是所有短的数字都要放在前面?
其实不是的,比如3和34,一种是334,一种是343,还要考虑到后面这一位的情况。
所以最终排列下来,“降序”排列,是[9,990,35,34,33,3,32,31,30]。
按照这个vector从前往后添加到要返回的字符串中,就可以了。
这道题的关键在于判断谁在前谁在后,比较的方法也很普通,就是补齐两个字符串,比较谁大谁小。
当然在实际操作中,没有必要真的对字符串补齐,我们同样可以操作。
代码如下:(附详解)
static bool cmp(int &a1,int &b1)//自定义一个比较函数,大的放前面
{
string a=to_string(a1),b=to_string(b1);//先把两个整数转化为字符串,操作起来比较方便
int s1=a.size(),s2=b.size();
if(s1<s2)//如果a短b长
{
for(int i=0;i<s1;i++)//在a的长度内比较
{
if(a[i]>b[i])//如果发现a中的某一位数值已经大于b中同一位的数值,比如4和39
return true;//那么比较到此结束,4要放在前面
else if(a[i]<b[i])//如果发现a中的某一位数值已经小于b中同一位的数值,比如4和61
return false;//那么比较到此结束,61要放在前面
}
for(int i=s1;i<s2;i++)//如果上面的比较没出结果,比如4和456这种情况,那么开始新的比较,直到到达第二个字符串的最后一位
{ //这个循环其实比较的是4和5,5和6,到达第二个字符串的最后一位就不比较了
if(b[i-s1]>b[i])//如果满足条件,那么a要放在前面
return true;
else if(b[i-s1]<b[i])//如果满足条件,那么b要放在前面
return false;
}
for(int i=0;i<s1;i++)//如果上面的比较没出结果,其实我们还有最后一位没有比较,6和4
{
if(a[i]<b[s2-s1+i])
return true;
else if(a[i]>b[s2-s1+i])
return false;
}
return false;//如果上述比较都没出结果,比如3和333,那么返回false,这里随便拼都可以
}
else if(s1>s2)//如果a长b短,一样的比较方式
{
for(int i=0;i<s2;i++)
{
if(a[i]<b[i])
return false;
else if(a[i]>b[i])
return true;
}
for(int i=s2;i<s1;i++)
{
if(a[i-s2]>a[i])
return false;
else if(a[i-s2]<a[i])
return true;
}
for(int i=0;i<s2;i++)
{
if(b[i]>a[s1-s2+i])
return true;
else if(b[i]<a[s1-s2+i])
return false;
}
return false;
}
else//如果两个一样长,那么直接逐位比较就可以了
{
for(int i=0;i<s1;i++)
{
if(a[i]>b[i])
return true;
else if(a[i]<b[i])
return false;
}
return false;
}
}
string largestNumber(vector<int>& nums)
{
sort(nums.begin(),nums.end(),cmp);//调用sort函数进行排序,排序准则是我们自定义的比较函数
string res;
for(auto i:nums)
res+=to_string(i);//不断地插入到字符串的末尾
if(res[0]=='0')return "0";//边界条件,如果第一位是0,那么说明后面即使有,也是全0,这时候我们只需要返回0就可以了了,而不是一长串的0
return res;
}
上述代码实测4ms,beats 99.85% of cpp submissions。
关于cmp函数,笔者在网上看到过一个简单的降序排列的版本,如下:
bool cmp1(int &a,int &b)
{
return a>b;
}
int main()
{
vector<int>nums={1,2,3,4,5,6,7,8,9,10,11,12};
sort(nums.begin(),nums.end(),cmp1);
for(int i:nums)
cout<<i<<" ";
cout<<endl;
return 0;
}
上面的cmp1这个函数,笔者个人猜想其实是说,如果a>b,那么返回true,认为前面的数大于后面的数是正确的。
所以在进行排序的时候,如果前面的数大于后面的,那么经过cmp1这个函数,返回true,认为正确,所以不用更改。
如果前面的数小于后面的数,那么经过cmp1这个函数,返回false,认为错误,所以要换一下位置。
所以笔者就根据自己的猜想,设计了题解代码中的cmp函数,从结果来看,上述认识还是有一定可取之处的。
但上述仅为笔者个人的猜想,有可能是不完全的甚至有些错误,没有仔细地去查sort函数的参数,仅作为一个个人的认识。
leetcode-179-Largest Number(理解规则,自定义cmp函数进行排序)的更多相关文章
- leetcode 179. Largest Number 、剑指offer33 把数组排成最小的数
这两个题几乎是一样的,只是leetcode的题是排成最大的数,剑指的题是排成最小的 179. Largest Number a.需要将数组的数转换成字符串,然后再根据大小排序,这里使用to_strin ...
- Java 特定规则排序-LeetCode 179 Largest Number
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- [LeetCode] 179. Largest Number 最大组合数
Given a list of non negative integers, arrange them such that they form the largest number. Example ...
- JavaScript中sort方法的一个坑(leetcode 179. Largest Number)
在做 Largest Number 这道题之前,我对 sort 方法的用法是非常自信的.我很清楚不传比较因子的排序会根据元素字典序(字符串的UNICODE码位点)来排,如果要根据大小排序,需要传入一个 ...
- [leetcode]179. Largest Number最大数
Given a list of non negative integers, arrange them such that they form the largest number. Input: [ ...
- leetcode 179. Largest Number 求最大组合数 ---------- java
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- Java for LeetCode 179 Largest Number
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- [LeetCode] 179. Largest Number 解题思路
Given a list of non negative integers, arrange them such that they form the largest number. For exam ...
- LeetCode 179 Largest Number 把数组排成最大的数
Given a list of non negative integers, arrange them such that they form the largest number.For examp ...
随机推荐
- KbmMW 4.30.00 发布
今天早上,KbmMW发布了4.30.00 版,这个版本开始支持XE4 的WIN/WIN64/OSX. 暂时不支持ios开发,同时加强了通过JSON 的对象序列化.还有就是解决了我提交的几个有关 汉字处 ...
- Activiti中23张表的含义
1.与流程定义相关的4张表: 2.与执行任务相关的5张表: 3.与流程变量相关的2张表
- 2018.10.15 loj#6013. 「网络流 24 题」负载平衡(费用流)
传送门 费用流sb题. 直接从sss向每个点连边,容量为现有物品量. 然后从ttt向每个点连边,容量为最后库存量. 由于两个点之间可以互相任意运送物品,因此相邻的直接连infinfinf的边就行了. ...
- opp小节
本章总结 练习题 面向对象三大特性,各有什么用处,说说你的理解. 类的属性和对象的属性有什么区别? 面向过程编程与面向对象编程的区别与应用场景? 类和对象在内存中是如何保存的. 什么是绑定到对象的方法 ...
- HDU 1009 FatMouse' Trade (贪心算法)
题意:就是老鼠要用猫粮换粮食,第i个房间一些东西,要用东西去换,可以不全换.问给定的猫粮最多能换多少粮食. 析:贪心算法.我们先算出来每个房间物品的平均价格是多少,肯定越低越好,并且如果能全换就全换, ...
- 命令行中开启mySQL数据库服务
sudo /Applications/XAMPP/xamppfiles/bin/mysql.server start
- jQueryUI datepicker 报错: TypeError: inst is undefined
前提:要引用的js等都引用好了 调用日期控件的input: <input id="starttime" name="starttime" class=&q ...
- (最小生成树) Borg Maze -- POJ -- 3026
链接: http://poj.org/problem?id=3026 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82831#probl ...
- 基于MATLAB的中值滤波算法实现
在实时图像采集中,不可避免的会引入噪声,尤其是干扰噪声和椒盐噪声,噪声的存在严重影响边缘检测的效果,中值滤波是一种基于排序统计理论的非线性平滑计数,能有效平滑噪声,且能有效保护图像的边缘信息,所以被广 ...
- 集合(一)ArrayList
前言 这个分类中,将会写写Java中的集合.集合是Java中非常重要而且基础的内容,因为任何数据必不可少的就是该数据是如何存储的,集合的作用就是以一定的方式组织.存储数据.这里写的集合,一部分是比较常 ...