美文网首页iOS算法题
IOS 算法(中级篇) ----- 最大数

IOS 算法(中级篇) ----- 最大数

作者: ShawnAlex | 来源:发表于2021-04-12 13:50 被阅读0次

给定一组非负整数 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点即可, 尤其第一点

  • 首尾大的数放在前面(首位相等依次判断第二位, 第三位....)

例如

  1. [80, 9], 虽然80 > 9, 但是 809 < 980, 首位大的要放在前面,
  2. [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 算法合集地址

相关文章

网友评论

    本文标题:IOS 算法(中级篇) ----- 最大数

    本文链接:https://www.haomeiwen.com/subject/jqhxlltx.html