Java 特定规则排序-LeetCode 179 Largest Number
2015-05-03 12:48
591 查看
Given a list of non negative integers, arrange them such that they form the largest number.
For example, given
Note: The result may be very large, so you need to return a string instead of an integer.
而这个规则便是:数字按照字典序排序比如321和4,那么321<4,因为从高位开始3<4(ascii码)
但是有一种特殊情况,如30和3,按照字典序排序应该是30>3,但是在本题目中如果我们想组成最大数字必须是30<3,因为303<330
这样我们就得出了排序的规则,那么如何实现这两种规则
代码如下:
这里我用的是优先队列(即二叉堆,直接用排序也可以)
代码如下:
注意特殊情况处理就是数组中给出的全是0,而题目要求返回字符串,注意别返回"000"这种情况,特殊处理下。
我看了下Discuss差不多就这两种,大同小异
For example, given
[3, 30, 34, 5, 9], the largest formed number is
9534330.
Note: The result may be very large, so you need to return a string instead of an integer.
题意:
给出无序数组A,利用数组A中的数字进行排列得出一个数字N,使得N最大分析:
该题归根结底是按照一种特殊的规则对原数组进行排序,使得排序后的数组拼接在一起得到的数字最大。而这个规则便是:数字按照字典序排序比如321和4,那么321<4,因为从高位开始3<4(ascii码)
但是有一种特殊情况,如30和3,按照字典序排序应该是30>3,但是在本题目中如果我们想组成最大数字必须是30<3,因为303<330
这样我们就得出了排序的规则,那么如何实现这两种规则
解法1
给出整数o1和o2,我们知道字符串之间的比较就是按照字典序进行的,那么我们比较o1+o2和o2+o1即可完成上述规则代码如下:
public String largestNumber(int[] nums) { PriorityQueue<String> pq = new PriorityQueue<>(10, new Comparator<String>() { @Override public int compare(String o1, String o2) { return (o1 + o2).compareTo(o2 + o1); } }); for (int i = 0; i < nums.length; i++) { pq.add(Integer.toString(nums[i])); } StringBuilder sb = new StringBuilder(); while (!pq.isEmpty()) { sb.insert(0, pq.poll()); } String tmp = sb.toString(); if (tmp.charAt(0) == '0') return "0"; return sb.toString(); }
这里我用的是优先队列(即二叉堆,直接用排序也可以)
解法2
这是与实验室师弟讨论的结果,由于在这次排序中无论数字有几位,如果每一位上全是9那么这个数字一定是最大的,必须排在最前面,如{99, 30, 9, 5}那么99和9一定是放在最前面的,那么换个思路,我比较两个数字大小那么可以比较在对应最大的数字所占的百分比。如3和30,那么我比较3/9和30/99的大小来判断30和3的大小代码如下:
public String largestNumber2(int[] nums) { PriorityQueue<Integer> pq = new PriorityQueue<>(10, new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { int t1 = o1, t2 = o2; double a1 = 0.0, a2 = 0.0; do { a1 = a1 * 10 + 9; t1 /= 10; } while (t1 != 0); do { a2 = a2 * 10 + 9; t2 /= 10; } while (t2 != 0); if (o1 / a1 > o2 / a2) return 1; else if (o1 / a1 < o2 / a2) return -1; else return 0; } }); for (int i = 0; i < nums.length; i++) { pq.add(nums[i]); } StringBuilder sb = new StringBuilder(); while (!pq.isEmpty()) { sb.insert(0, pq.poll()); } String tmp = sb.toString(); if (tmp.charAt(0) == '0') return "0"; return sb.toString(); }
注意特殊情况处理就是数组中给出的全是0,而题目要求返回字符串,注意别返回"000"这种情况,特殊处理下。
我看了下Discuss差不多就这两种,大同小异
相关文章推荐
- Java for LeetCode 179 Largest Number
- [leetcode-179]Largest Number(java)
- (Java) LeetCode 82. Remove Duplicates from Sorted List II —— 删除排序链表中的重复元素 II
- leetcode:sort:Largest Number(179)
- LeetCode147_Insertion Sort List(用插入排序算法对链表进行排序) Java题解
- LeetCode - 179 - Largest Number
- LeetCode(179) Largest Number
- [LeetCode]179 Largest Number
- java编程排序之内置引用类型的排序规则实现,和自定义规则实现+冒泡排序运用
- LeetCode179:Largest Number
- Datafarne按照某一列的特定规则进行排序【Python】
- Largest Number(leetcode 179)
- LeetCode(179) Largest Number
- java POJO实现类比较器Comparable的排序规则
- Leetcode 179(Java)
- leetcode 179: Largest Number
- (Java) LeetCode 83. Remove Duplicates from Sorted List —— 删除排序链表中的重复元素
- Largest Number(leetcode 179)
- java Comparator 特定顺序排序 固定值排序
- 关于java的排序规则写法