[每日算法] leetcode第179题 Largest Number

这篇博客介绍了LeetCode第179题,要求根据非负整数列表组合出最大的数字。文章讲解了题目的含义、解题思路、算法复杂度分析,并提供了C++实现代码。重点在于理解如何通过特定的排序规则来解决数字组合问题。
摘要由CSDN通过智能技术生成

原题目描述

  • Given a list of non negative integers, arrange them such that they
    form the largest number.

    Example 1:
    Input: [10,2]
    Output: “210”

    Example 2:
    Input: [3,30,34,5,9]

    Note: The result may be very large, so you need to return a string instead of an integer.

题目大意

该题题目大意是给定一串数字,将该数字按照一定的顺序组合成一个数字,要求返回的数字是这串数字所能组成数值最大的数字(同时因为可能输出的数字会比较大,超过long所能表示的范围,所以需要返回字符串)。

解题思路

该题给定的是一个int的vector,而返回的是一个string,所以我们很自然地想要先把这些int都转成string类,然后按照一定的顺序排序,排完序之后按顺序便可以组成最大的数字。
那么,应该如何排序呢?最开始想到的办法是把转成string之后的数字按照字典序排列,例如【1, 2, 3】,按照字典序排列得出的便是321,是不是很简单,但是这只成立于vector里数字位数都相等的情况,当位数不同时,如【3,30】,按照字典序排序得到的是303,而正确结果是330,所以还需要分情况讨论(字符串长度相等和不等两种情况)。
但其实有更简单的一种排序方式,无需分情况讨论,那便是比较两个字符串的排序判断条件为 a + b > b + a,如上面所说的,因为330 > 303是成立的,那么3应该排在30的前面,以此对每两个字符串进行排序(可以使用冒泡或选择排序),便可以得到正确序列的结果,最后进行组合便得到所求字符串。
(PS,其中还有特殊情况需要另外讨论,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值