米拓世纪初试
米拓世紀初試筆記;
兩道編程題:
給定一個由正數,負數和0組成的整數數組,將所有為0的元素,挪到數組末尾。要求時間復雜度O(n)
解題思路:采用左右指針,同時向中間遍歷,這樣只需要遍歷一遍數組就可以完成
/*** @author chen*/ public class Main {/*** 一個由正數,負數和0組成的整數數組,將所有為0的元素,挪到數組末尾** @param array 整數數組*/public void moveNumber(int[] array) {int left = 0;int right = array.length - 1;while (left < right) {// 從左往右查找一個 0 的元素while (array[left] != 0) {left++;}// 從右往左查找一個非 0 元素while (array[right] == 0) {right--;}if (left < right) {// 交換兩個數array[left] = array[left] ^ array[right];array[right] = array[left] ^ array[right];array[left] = array[left] ^ array[right];}}} }給定任意一個自然數,獲取它重新排列后,下一個比它大的自然數,要求時間復雜度O(n)。例如:
給定1233,它的下一個是1323;給定1323,它的下一個是1332;給定9876,它的下一個不存在;請設計一個函數,完成此功能。解題思路:將數字轉換成數組,從右往左查找第一個前一個數字比后一個小的位置,如果存在交換兩個數字,如果不存在就返回-1
/*** @author chen*/ public class Main {/*** 獲取它重新排列后,下一個比它大的自然數,如果不存在則返回-1** @param number 數字* @return 下一個比他大的自然數*/private int nextNumber(int number) {int[] array = numberToArray(number);if (array.length == 1) {return -1;}// 調換位置開始的地方,后一個數比前一個數大int i = -1;boolean flag = false;for (i = array.length - 1; i > 0; i--) {if (array[i] > array[i - 1]) {flag = true;break;}}// 交換位置if (flag) {array[i] = array[i] ^ array[i - 1];array[i - 1] = array[i] ^ array[i - 1];array[i] = array[i] ^ array[i - 1];// 組合數字int sum = 0;for (int value : array) {sum = sum * 10 + value;}return sum;}return -1;}/*** 將一個數字轉換成數組** @param number 數字——數字為自然數* @return 數字數組*/private int[] numberToArray(int number) {if (number == 0) {return new int[1];}int[] temp = new int[100];int index = 0;while (number > 0) {int t = number % 10;temp[index++] = t;number /= 10;}System.out.println(index);int[] array = new int[index];for (int i = 0, j = index - 1; i < index; i++, j--) {array[i] = temp[j];}return array;} }總結