给定一个整型数组,对这个整型数组排序,使得按序拼接数组各元素

2014年去哪儿网笔试题–给定一个整型数组,对这个整型素组排序,使得按序拼接数组各元素得到的值最小。

我的大致思路是把这个整型数组转换成String数组,然后通过String类的compareTo方法对这个数组进行第一次排序,排序得到的结果恰好是按字典序排序,而字典序又恰好是数字从0-9的顺序,,恰好符合这个要求。最后进行检验下,有的可能需要调换下顺序使得数最小。

package com.cn.qunar.test;/** * @author 刘利娟 liulijuan132@gmail.com * @version 创建时间:2014年8月2日 上午7:33:31 类说明: 给定一个整型数组,对这个整数数组排序,使得按序拼接数组各元素得到的值最小。 *示例:[3,83,8,13,1],被排序之后的数组为[1,13,3,83,8]。 依次拼接得到最小的数1133838。 */public class IntSort {public static void main(String[] args) {int[] array = new int[] { 3, 83, 8, 101, 10103 };String[] strings = new String[array.length];for (int i = 0; i < array.length; i++) {strings[i] = Integer.toString(array[i]);System.out.println(strings[i]);}for (int i = 0; i < strings.length – 1; i++) {for (int j = 0; j < strings.length – i – 1; j++) {if (strings[j].compareTo(strings[j + 1]) > 0) {System.out.println(strings[j] + ">" + strings[j + 1]);String temp = strings[j];strings[j] = strings[j + 1];strings[j + 1] = temp;}}}for (int i = 0; i < strings.length; i++) {System.out.println(strings[i]);}for (int i = 0; i < strings.length – 1; i++) {int lengths = (strings[i].length() > strings[i + 1].length()) ? strings[i + 1].length() : strings[i].length();System.out.println("长度:" + lengths);for (int j = 0; j < lengths; j++) {if (strings[i].charAt(j) == strings[i + 1].charAt(j)) {int si = Integer.parseInt(strings[i]);int si1 = Integer.parseInt(strings[i+1]);int sim = 1;for(int k = 0; k < strings[i].length(); k++){sim *= 10;}int si1m = 1;for(int k = 0; k < strings[i+1].length(); k++){si1m *= 10;}if((si * si1m+si1)>(si1 * sim + si)){System.out.println((si * si1m+si1)+">"+(si1 * sim + si));String temp = strings[i];strings[i] = strings[i+1];strings[i+1] = temp;}}}}StringBuffer sb = new StringBuffer();for(int i = 0; i < strings.length; i++){sb.append(strings[i]);}System.out.println("排序结果:"+sb);}}

虽然效率不是很高= =,但好歹是自己想出来的。已验证该知道答案均不正确。

2015-01-15 修改

这个方法遇到有值相同的数组时就得不到正确结果。昨天刷oj时,看到一类似题目,使得按序拼接数组各元素所得值最大,结果没有通过用例,才发现的问题。之后,在讨论区看到很多很好的解法。

class StringComparator implements Comparator<String> {public int compare(String a, String b) {if (a.length() == b.length()) {return b.compareTo(a);} else {String ab = a + b;String ba = b + a;return ba.compareTo(ab);}}}public class Solution {public String largestNumber(int[] num) {StringBuffer sbuf = new StringBuffer();ArrayList<String> numstrings = new ArrayList<String>(num.length);for (int i : num) numstrings.add(String.valueOf(i));Collections.sort(numstrings, new StringComparator());for (String s : numstrings) sbuf.append(s);String res = sbuf.toString();if (res.length() > 0 && res.charAt(0) == '0') return "0";return res;}以上方式使用了java API中的Collections静态工具类中sort方法,通过实现Comparator接口,重写compare方法,使得排序按照题目要求的顺序进行。

谁的指间滑过了千年时光;谁在反反复复中追问可曾遗忘;

给定一个整型数组,对这个整型数组排序,使得按序拼接数组各元素

相关文章:

你感兴趣的文章:

标签云: