本题要求实现一个找出整型数组中最大值的函数。_【每日一题】数组系列(1)—— 把数组排成最小的数...

每日一题,选自LeetCode、牛客网、剑指offer、国内外大厂面试真题等。目标是培养算法思维,终极目标是吊打面试官,斩获大厂offer !

1.题目

输入一个正整数数组,把数组里所有数字 拼接起来排成一个数,打印能拼接出的所有数字中 最小的一个。

示例1:

输入: [10,2] 输出: "102"

示例2:

输入: [3,30,34,5,9] 输出: "3033459"

提示:

  • 0 < nums.length <= 100

说明:

  • 输出结果可能非常大,所以你需要返回一个字符串而不是整数

  • 拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/ba-shu-zu-pai-cheng-zui-xiao-de-shu-lcof/ 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


2.解题

2.1 头脑风暴

  • 简单来说,本题就是要求拼接起来的“最小值”,其实本质上还是一个 排序问题

  • 考虑到是排序问题,可以直接使用快排函数 sort()。但是根据题目要求,要求的是拼接起来的“最小值”,因此要改变 排序判断规则

  • 由于输入的是整型数组,而拼接、输出的是字符串。因此,还要熟悉 整型转字符型的 方法。

对于上面的三个问题下面我们来一一剖析:(1)对于基本的几种排序方法,以及相应的算法复杂度分析,了解一下还是很有必要。如果还不太了解,建议你先加加餐:【算法之美】不要再用冒泡、选择、插入排序了,丢不起这人!

(2)sort()函数是一种很常用的快排方法,不仅能节省编写代码的时间,而且在时间、空间复杂度上的综合指标也不错。

  • 先熟悉一下sort()函数的基本用法:

在C++中,使用sort()函数前,需添加头文件:#include1. 默认情况下是:从小到大排序(升序)sort(arrNum.begin(), arrNum.end())2.如果要从大到小排序(降序),则需要添加排序判断规则bool compare(int a, int b){    return a>b;   //自定义判断规则}sort(arrNum.begin(), arrNum.end(), compare)  //降序
  • 那么对于本题,需要如何 改变判断规则,才能使 拼接起来的数最小呢?我们可以先看一下这张图:

c1ba23c9f4cc356c74cd3eee0a37099a.png

比如“3”和“30”,到底谁应该放前面?

我们只需先拼接起来看一下:330 或者 303。很明显,303要小,因此要将30排前面,3放在后面。

不难理解,要使得拼接后的值最小,就要想方设法把“小数”放在前面,但是每一个数的 位数不同,因此我们不能直接进行比较。

这里可以用一个 取巧的方法不去比较数的每一位的大小, 而是去比较前后字符串拼接后的“大小”。

当数组中,每相邻元素都满足这种“大小”关系时,最后将排列后的数组元素拼接在一起就是最小值了。那么怎么通过改变判断规则实现呢?实现方法如下:

bool compare(string s1, string s2){  return s1+s2 < s2+s1;}sort(arr_str.begin(), arr_str.end(), compare)

补充一下 字符串大小比较 规则:从左往右,依次比较每个字符对应的ASCII码值,大者为大,小者为小;若相等,则继续比较后面的字符。

(3)整型转字符型

  • 对于大部分编译器,支持C++11新特性,可以直接使用函数to_string()

使用前需添加头文件:#includestr_num = to_string(num) //将整型数num转化成字符串str_num
  • 对于不支持C++11的编译器(比如一些竞赛中),可使用如下方法:

使用前需添加头文件:#include实现整型转字符串:string NumToString(int num){   string output;  stringstream Convert;  Convert<  Convert>>output;  return output;}

2.2 代码实践

熟悉以上解题思路后,我们就可以编写出简单有效的代码了:

class Solution {public:  static bool compare(string s1, string s2){    return s1+s2 //自定义排序规则   }    string minNumber(vector<int>& nums) {        vector<string> temp;        for(int n : nums){            temp.push_back(to_string(n)); //整型转字符串         }        sort(temp.begin(), temp.end(), compare); //按自定义规则排序         string ans = "";        for(string s : temp) ans += s; //拼接         return ans;    }};

测试结果:66a0e1e8b5fd5be6e48214de9900a2e1.png

喜欢就点个在看再走吧 5ad07f8dc5f38f36973c74e27d151f69.png
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值