【劍指offer】-把數組排成最小的數-33/67

1. 題目描述

輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數,打印能拼接出的所有數字中最小的一個。例如輸入數組{3,32,321},則打印出這三個數字能排成的最小數字爲321323。

2. 題目描述

  1. 題目的意思:給你一個數組,要求你返回一個字符串,爲這些數組中最小的數(字符串)
  2. 我們需要對數組內的數字進行排序,這裏進行的排序指的是對其在數組內的位置進行排序,這裏我們需要一個規則,如果NM > MN,則N>M;這裏的大於不是常規的大於關係,是我們自己定義的一個關係
  3. 將數組依次存入ArrayList中,對於ArrayList進行排序,可以選擇的排序方式有:冒泡排序、快速排序、重寫排序方法
  4. 最終利用StringBuilder的toString的方法,得到最終的結果

3. 題目代碼

public class Test35 {
	public static void main(String[] args) {
		int[] nums = new int[] { 3, 30, 34, 5, 9 };
		System.out.println(PrintMinNumber(nums));
	}

	public static String PrintMinNumber(int[] numbers) {
		ArrayList<String> list = new ArrayList<>();
		for (int i = 0; i < numbers.length; i++) {
			list.add(String.valueOf(numbers[i]));
		}
		// for (int i = 0; i < list.size() - 1; i++) {
		// for (int j = 0; j < list.size() - i - 1; j++) {
		// String string = list.get(j + 1);
		// String string1 = list.get(j) + string;
		// String string2 = string + list.get(j);
		// if (string1.compareTo(string2) >= 0) {
		// list.set(j + 1, list.get(j));
		// list.set(j, string);
		// }
		// }
		// }
		kuaipai(list, 0, list.size() - 1);
		System.out.println(list);
		StringBuilder stringBuilder = new StringBuilder();
		for (int i = 0; i < list.size(); i++) {
			stringBuilder.append(list.get(i));
		}
		return stringBuilder.toString();
	}

	public static void kuaipai(ArrayList<String> list, int left, int right) {
		if (left >= right) {
			return;
		}
		int i = left;
		int j = right;
		String string = list.get(i);
		while (i < j) {
			while (i < j && (list.get(j) + string).compareTo(string + list.get(j)) >= 0) {
				j--;
			}
			list.set(i, list.get(j));
			while (i < j && (list.get(i) + string).compareTo(string + list.get(i)) <= 0) {
				i++;
			}
			list.set(j, list.get(i));
		}
		list.set(i, string);
		kuaipai(list, left, i - 1);
		kuaipai(list, i + 1, right);
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章