IOS 算法(中级篇) ----- 最大数
2021-04-12 本文已影响0人
ShawnAlex
给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。
1 <= nums.length <= 100
0 <= nums[i] <= 109
例子
输入:nums = [10,2]
输出:"210"
输入:nums = [3,30,34,5,9]
输出:"9534330"
示例 3:
输入:nums = [1]
输出:"1"
解题思路
排序法
题意不算难理解, 排序找最大数值
首先重点理解2点即可, 尤其第一点
- 首尾大的数放在前面(首位相等依次判断第二位, 第三位....)
例如
- [80, 9], 虽然80 > 9, 但是 809 < 980, 首位大的要放在前面,
- [30, 3], 虽然首位 3 = 3 , 但是 330 > 303, 需要判断最后位
这点我们可以通过转成 "字符串求和" 来判断处理
- 结果如果是 "00" 这种全0的, 要返回 "0" (我做的时候, 也漏了这个算"0")
代码
未翻译版
func largestNumber(_ nums: [Int]) -> String {
let temp = nums.sorted{
i, j in
let istr = String(i), jstr = String(j)
return istr + jstr > jstr + istr
}
var result = ""
for i in temp {
result += String(i)
}
return result.first == "0" ? "0" : result
}
翻译版
func largestNumber(_ nums: [Int]) -> String {
// 将nums排序, 由大到小
// 重点"istr + jstr > jstr + istr" 这块
// 转成字符串之和, 判断顺序
let temp = nums.sorted{
i, j in
let istr = String(i), jstr = String(j)
return istr + jstr > jstr + istr
}
// 循环字符串求和
var result = ""
for i in temp {
result += String(i)
}
// 留意下"000..."返回"0", 否则result返回
return result.first == "0" ? "0" : result
}
题目来源:力扣(LeetCode) 感谢力扣爸爸 :)
IOS 算法合集地址