yankewei / LeetCode

LeetCode 问题的解决方法
MIT License
6 stars 0 forks source link

最大数 #131

Open yankewei opened 3 years ago

yankewei commented 3 years ago

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

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

示例 1:

输入:nums = [10,2]
输出:"210"

示例 2:

输入:nums = [3,30,34,5,9]
输出:"9534330"

示例 3:

输入:nums = [1]
输出:"1"

示例 4:

输入:nums = [10]
输出:"10"

提示:

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

yankewei commented 3 years ago

从题意我们可以看出来,只要找到每个数的最高位,然后根据最高位进行排序。 但是也会出现两个数的最高位相同,比如 30, 34 这时可以把两个数拼接起来,3034,3430,选择较大值放在前即可。

func largestNumber(nums []int) string {
    sort.Slice(nums, func (i, j int) bool {
        iHigh := getHigh(nums[i])
    jHigh := getHigh(nums[j])
    if iHigh < jHigh {
        return false
    }
    if iHigh == jHigh {
        x, y := strconv.Itoa(nums[i]) + strconv.Itoa(nums[j]), strconv.Itoa(nums[j]) + strconv.Itoa(nums[i])
        xInt, _ := strconv.Atoi(x)
        yInt, _ := strconv.Atoi(y)
        if xInt < yInt {
        return false
        }
    }
    return true
    })
    if nums[0] == 0 {
        return "0"
    }
    ans := ""
    for _, v := range nums {
    ans += strconv.Itoa(v)
    }
    return ans
}

func getHigh(x int) int {
    for x >= 10 {
    x /= 10
    }
    return x
}