/** * 给出一个数组,如 [7864, 284, 347, 7732, 8498], * 现在需要将数组中的数字拼接起来,如按顺序依次拼接为:786428434777328498,数组中的数字拼接顺序可以任意, * 编写程序,返回「最大的可能拼出的数字」。(以上面数组为例,返回849878647732347284) * @param arrays * @return */
解题思路:拆解数组中的每一个数,将数值存放到栈中(明显的栈形数据结构);排序(用到了冒泡排序的思路) ,排序过程比较大小通过各数值之间的高位到低位的大小比较,比如8,70,按照这个排序8属于大者;最后将数组从后向前输出即完成拼接
- public static String getMaxNum(long[] arrays) {
- if (arrays == null || arrays.length == 0) {
- return "0";
- }
-
- //存放所有拆解后的数据集
- Map<Long, Stack<Integer>> numMaps = Maps.newHashMap();
-
- for (long tn : arrays) {
- long t = tn;
- Stack<Integer> qu = new Stack<>();
- do {
- qu.push((int) t % 10);
- t = t / 10;
- } while (t > 0);
-
- numMaps.put(tn, qu);
- }
-
- for (int i = 0; i < arrays.length; i++) {
- for (int j = 0; j < arrays.length - i - 1; j++) {
- Stack<Integer> f = numMaps.get(arrays[j]);
- Stack<Integer> s = numMaps.get(arrays[j + 1]);
- //比较大小
- int fn = f.size() - 1;
- int sn = s.size() - 1;
- do {
- if (f.get(fn) < s.get(sn)) {
- break;
- }
-
- if (f.get(fn) > s.get(sn)) {
- long tn = arrays[j];
- arrays[j] = arrays[j + 1];
- arrays[j + 1] = tn;
- break;
- }
-
- fn--;
- sn--;
- } while (fn >= 0 && sn >= 0);
- if (fn == -1 || sn == -1) {
- fn = fn == -1 ? 0 : fn;
- sn = sn == -1 ? 0 : sn;
- if (f.get(fn) > s.get(sn)) {
- long tn = arrays[j];
- arrays[j] = arrays[j + 1];
- arrays[j + 1] = tn;
- }
- }
-
- }
- }
- StringBuffer sb = new StringBuffer();
- for (int i = arrays.length - 1; i >= 0; i--)
- sb.append(arrays[i]);
-
- return sb.toString();
- }
执行Case数据
- long a[] = new long[]{764, 76, 77};
- long b[] = new long[]{767, 76, 77};
- long c[] = new long[]{7864, 284, 347, 7732, 8498};
执行结果