Leetcode 179 Largest Number

  • 题目
  • 思路
  • 代码
  • 优化

题目

Given a list of non negative integers, arrange them such that they form the largest number.

Example 1:
Input: [10,2]
Output: “210”

Example 2:
Input: [3,30,34,5,9]
Output: “9534330”
Note: The result may be very large, so you need to return a string instead of an integer.

思路

考虑自定义一个comparator去比较大小,“大”的概念就是数字出现在答案的前面部分。
多写几个例子可以发现,例如12和1212,123和123123123这种循环的都是相等的,谁放前面都是同一个数,这就给了我们一个比较基本的想法,以长度短的为一个周期一位一位去比较。
例如34和345,把34看成34|5,5比3大所以345大,验证34534>34345,也可以看到大小差确实发生在5和3这位上;同理34和34|2,就是34大,验证34342>34234。
最复杂的是刚才比较下来是相等的,但其实不相等因为位数不同,举几个例子。

8308和830
8308 > 830 因为 8308830 > 8308308,我们发现产生差异的是8 > 3那位。

12和121
132 > 1321 因为1321321 > 1321132,产生差异的是3 > 1那位。

332和3323
3323 > 332,因为3323323 < 3323332,产生差异的是3 > 2那位。

334和3343
334 > 3343,因为3343343 > 3343334,产生差异的是4 > 3那位。

这时观察发现产生差异的是长度较短的数从左往右比较第i位和第i+1位的大小决定的,结合例子可以方便理解他们的大小和对应比较的位数的关系。

代码

class Solution {public String largestNumber(int[] nums) {Integer[] temp = Arrays.stream(nums).boxed().sorted((o1, o2) -> {String s1 = Integer.toString(o1);String s2 = Integer.toString(o2);if (s1.length() == s2.length()) return Integer.compare(o1, o2);if (s1.length() < s2.length()) {for (int i = 0; i < s2.length(); i++) {if (s1.charAt(i % s1.length()) < s2.charAt(i)) {return -1;} else if (s1.charAt(i % s1.length()) > s2.charAt(i)) {return 1;}}for (int i = 0; i < s1.length() - 1; i++) {if (s1.charAt(i) > s1.charAt(i + 1)) {return -1;}}return 1;} else {for (int i = 0; i < s1.length(); i++) {if (s1.charAt(i) < s2.charAt(i % s2.length())) {return -1;} else if (s1.charAt(i) > s2.charAt(i % s2.length())) {return 1;}}for (int i = 0; i < s2.length() - 1; i++) {if (s2.charAt(i) > s2.charAt(i + 1)) {return -1;}}return -1;}}).toArray(Integer[]::new);StringBuilder sb = new StringBuilder();int i = temp.length - 1;while (i >= 0 && temp[i] == 0) {i--;}for (; i >= 0; i--) {sb.append(temp[i]);}return sb.toString().equals("") ? "0" : sb.toString();}
}

优化

代码中用到了转成Integer类后使用数组自带排序的方法,显然直接自己写一个mergeSort会更好。
查看Sample答案,还有一个很好的想法是比较的时候并不适用String而是计算出两个数a,b的位数,然后a10进行b的位数次+b和b10进行a的位数次+a两个数直接比较,参考代码如下。

class Solution {public String largestNumber(int[] nums) {sort(nums, 0, nums.length);// If the first element is 0, the result itself is 0if (nums[0] == 0) return "0";StringBuilder result = new StringBuilder();for (int num : nums) result.append(num);return result.toString();}// We can use string comparator// (b + a).compareTo(a + b)// However, concatenating strings and comparing takes more time// So, use the above logic but using numberprivate boolean compare(int a, int b) {long aLong = a * 10, bLong = b * 10;int x = a, y = b;while ((x /= 10) > 0) bLong *= 10;while ((y /= 10) > 0) aLong *= 10;return (aLong + b) > (bLong + a);}        // The array is of primitive, so we cannot pass comparator// This is a compact version of merge sortprivate void sort(int[] nums, int l, int r) {if (l >= r - 1) return ;int m = l + (r - l) / 2;sort(nums, l, m);sort(nums, m, r);merge(nums, l, m, r);}private void merge(int[] nums, int l, int m, int r) {int[] aux = new int[r - l];for (int i = l, j = m, k = 0; i < m || j < r;) {if (i < m && (j == r || compare(nums[i], nums[j]))) aux[k++] = nums[i++];else if (j < r) aux[k++] = nums[j++];}for (int i = 0; l < r; ++i) nums[l++] = aux[i];}
}

Leetcode 179 Largest Number相关推荐

  1. [LeetCode]179. Largest Number

    [LeetCode]179. Largest Number 题目描述 解题思路 求最大的数,在数组中对于每一位数字数值越大应当越靠前,如:9 > 5,所以9应该在5之前 需要考虑的是对于不同位数 ...

  2. [LeetCode]179.Largest Number

    [题目] Given a list of non negative integers, arrange them such that they form the largest number. For ...

  3. LeetCode(179) Largest Number

    题目如下: Given a list of non negative integers, arrange them such that they form the largest number. Fo ...

  4. [leetcode]179 Largest Number

    问题描述: Given a list of non negative integers, arrange them such that they form the largest number. Fo ...

  5. [leetcode] 179 Largest Number

    拿到这个题的第一个想法是 将int转换成string,然后按照string的比较规则,但是发现  13<3<34这种不好处理. 那么何不我们直接比较下两者的组合,取其较大的呢,由此自定义优 ...

  6. LeetCode:Largest Number - 求整型数组中各元素可拼合成的最大数字

    2019独角兽企业重金招聘Python工程师标准>>> 1.题目名称 Largest Number(求整型数组中各元素可拼合成的最大数字) 2.题目地址 https://leetco ...

  7. 179 Largest Number

    题目链接:https://leetcode.com/problems/largest-number/ 题目: Given a list of non negative integers, arrang ...

  8. largest number java_将给定的数组组成最大的数 Largest Number

    问题: Given a list of non negative integers, arrange them such that they form the largest number. For ...

  9. LeetCode——Kth Largest Element in an Array

    LeetCode--Kth Largest Element in an Array Question Find the kth largest element in an unsorted array ...

最新文章

  1. nothing about web app azure
  2. 手机经常提示找不到服务器,为什么我的手机显示无法连接到服务器
  3. 看下你是否都做了吗?系统140种实用设置2
  4. ASP.NET发送电子邮件
  5. 【CC November Challenge 2012】Arithmetic Progressions【分块】【FFT】
  6. A star算法优化一
  7. 系统提示System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或更高版本解决办法...
  8. 微软全球执行副总裁沈向洋:人工智能的机遇和挑战
  9. 系列学习 Swagger 之第 2 篇 —— SpringCloud Gateway 整合 Swagger(完结)
  10. request.getParameterValues()用法
  11. 狂神说笔记——JavaScript快速入门11
  12. 荣耀magic2换成鸿蒙系统,荣耀V40照常发布,将更换操作系统,搭载鸿蒙2.0发布
  13. HTTP状态代码2XX、3XX、4XX、5XX分析
  14. Redis基本数据类型String——数据结构解析
  15. 机器视觉光源的设计方法
  16. 【模电仿真】RC桥式正弦波发生电路
  17. NewStarCTF 公开赛赛道week3 web writeup
  18. pygame壁球游戏之节奏型操控型
  19. Dell电脑安装系统时看不到固态硬盘的解决方案
  20. uniapp微信小程序授权登录流程(代码直接复制可用)

热门文章

  1. **关于交流电机、直流电机、永磁同步电机、步进电机的分类与控制**
  2. 静则一念不生,动则万善相随
  3. Failures 的批量操作
  4. 计算机英语forward,英语forward是什么中文意思
  5. 浅析领导力和执行力在企业管理中的运用
  6. JS——修改背景图片
  7. 是35岁的焦虑被贩卖了吗?
  8. BOM 是个什么玩意!
  9. CPU Cache:访问存储速度是如何大幅提升的?
  10. 英语词汇收藏英语笔记