Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数 #8

Open
MY729 opened this issue Aug 5, 2019 · 0 comments

Comments

@MY729
Copy link
Owner

MY729 commented Aug 5, 2019

题目来源-力扣

题目

给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数

例如给定数组:

[3,30,34,5,9]  

输出:

"9534330"

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

分析

我们首先知道 组成这个数的最高位越大,这个数越大

我们先分析一个容易理解的解题思路:

  1. 遍历给定的数组,比较两个数的最高位,若最高位不相同,最高位较大的数在前
  2. 若最高位相同,则比较第二位数是否相同,若不相同,位数较大的数在前
  3. 若后面的位数还是相同,循环上面的步骤,直到找到不相同的位数,比较出两个数的前后顺序

由上面的分析,我们知道,此题的基本思想还是比较两个数的先后顺序,它与比较两个数的大小顺序类似,我们可以理解为此题只是排序的规则不同

普通排序,我们只需要比较 两个数的大小,而此题需要比较最高位数的大小,
比如 123 大于 4 但4的最高位大于123

基于上面的分析,对于此题我们可以这样比较两个数:
数字 a = 123, 数字 b = 4
将a和b 转字符串(使用 + '' 转字符串)
通过比较 a + b 和 b + a的大小,确定a和b的顺序
即”1234“ < ”4123“ 则 b(4) 在 a(123) 前面

最后注意一个边界:
输入:[0, 0, 0]
输出:”0“

答案

let largestNumber = function(nums) {
    let len = nums.length
    for (let i = 0; i < len; i++) {
        for (let j = 0; j < len; j++) {
            let left = nums[i] + '' + nums[j]
            let right = nums[j] + '' + nums[i]
            if (left > right) {
                let temp = nums[i]
                nums[i] = nums[j]
                nums[j] = temp
            }
        }
    }
    return nums.join('') > 0 ? nums.join('') : "0"
}

执行结果:

largestNumber([3, 30, 34, 5, 9]) // 调用
// 输出
"9534330"

largestNumber([0, 0]) // 调用
// 输出
"0"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant