leetcode--179:Largest Number

来源:互联网 发布:变色龙引导u盘安装mac 编辑:程序博客网 时间:2024/05/02 05:02

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

例子:          给定由非负整数组成的数组[3, 30, 34, 5, 9], 它们所组成的最大整数为: 9534330.

第一眼看到这题目,脑中闪现的思路就是:先找出各个数的首位数字,然后从大到小排序,首位数字相同再比较第二位数字的大小,写了一段时间后,发现写不下去了,因为当两个数的前几位数字相同时,还得考虑多出来的那位数字的大小问题,比如 

121,12   组成12121,

122,12组成12212,                    即多出来的那位数字必须大于最后一位相同的数字,感觉走不下去了。

于是决定转换思路:从最后的结果来看,它是通过对原来的数组中的元素进行调换顺序后,顺序输出得出的。 两个元素调换顺序的规则是:比较两个元素在不同顺序下所组成的数的大小。比如两个数:a,b ,需要比较数ab和ba的大小。

因此就有了下面的代码(java):

public class Solution {        public String largestNumber(int[] arr) {          String[] strs = new String[arr.length];                    for(int i=0; i<arr.length; i++) {              strs[i] = Integer.toString(arr[i]);          }                    Arrays.sort(strs, new Comparator<String>() {              @Override              public int compare(String s1, String s2) {                  String ss1 = s1 + s2;                  String ss2 = s2 + s1;                  int i=0;                  while(i<ss1.length()) {                      if(ss1.charAt(i)!=ss2.charAt(i)) {                          return ss1.charAt(i) - ss2.charAt(i);                      }                      ++i;                  }                  return 0;              }          }                  );                    StringBuilder sb = new StringBuilder();          for(int i=strs.length-1; i>=0; i--) {              sb.append(strs[i]);          }                    return sb.toString().replaceFirst("^0+(?!$)", "");        }  }





0 0