「算法」最大数 | 刷题打卡

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述:

原题链接 ? 179. 最大数

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

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

示例 1:

输入:nums = [10,2]
输出:"210"
复制代码

示例 2:

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

示例 3:

输入:nums = [1]
输出:"1"
复制代码

示例 4:

输入:nums = [10]
输出:"10"
复制代码

注意:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 109

二、思路分析:

思路1:

借助js中数组自带的sort方法,重新编写sort方法。

参数:

compareFunction 可选

用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。

  • firstEl

    第一个用于比较的元素。

  • secondEl

    第二个用于比较的元素。

返回值:

排序后的数组。请注意,数组已原地排序,并且不进行复制。

如果没有指明 compareFunction ,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。

如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素:

  • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;

  • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);

  • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。

  • compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

为了更加深入理解数组的sort方法的实现,我借助快排实现了个sort函数:

function sort(arr, compareFunction) {
  if (arr.length <= 1) return arr
  let start = 0,
    end = arr.length - 1,
    current = arr[start]
  while (start < end) {
    while (compareFunction(arr[end], current) > 0 && end > start) {
      end--
    }
    if (end == start) break
    arr[start] = arr[end]
    start++
    while (compareFunction(arr[start], current) < 0 && end > start) {
      start++
    }
    if (end == start) break
    arr[end] = arr[start]
    end--
  }
  arr[start] = current
  let left = arr.slice(0, start)
  let right = arr.slice(start + 1)
  return [
    ...sort(left, compareFunction),
    current,
    ...sort(right, compareFunction),
  ]
}
复制代码

三、完整代码:

思路1:

function solve(nums) {
  if (nums.join('') === new Array(nums.length).fill(0).join('')) return '0'
  nums = nums.map((one) => (one = one + ''))
  sort(nums, (a, b) => {
    let len1 = a.length,
      len2 = b.length,
      temp = ''
    if (len1 !== len2) {
      if (len1 > len2) {
        temp = a.slice(0, len2)
        if (temp == b && a[len2 - 1] > a[len2]) {
          return a - b
        }
      } else if (len1 < len2) {
        temp = b.slice(0, len1)
        if (temp == a && b[len1 - 1] > b[len1]) {
          return a - b
        }
      }
    }
    return b > a ? 1 : -1
  })
  return nums.join('')
}
复制代码

四、总结:

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享