1.查找數組中指定元素(二分查找)
public static void main(String[] args) {int[] array = {2,4,1,23,65,34,89,76,32};Arrays.sort(array);//排完升序:1,2,4,23,32,34,65,76,89 //Arrays.sort();這個工具可以順序打亂的數組排成正序System.out.println(binarySearch(array, 89)); }public static int binarySearch(int[] array,int key) {int left = 0;int right = array.length - 1;int mid = array.length / 2;while(left <= right) {if(key > array[mid]) {left = mid + 1;mid = (left + right) / 2;}else if(key < array[mid]) {right = mid - 1;mid = (left + right) / 2;}else{return mid;}}return -1; }
2.數組排序(冒泡排序)
public static void main(String[] args) {int[] array = {3,5,1,30,10};bubble(array);System.out.println(Arrays.toString(array)); }public static void bubble(int[] array) {for (int i = 0; i < array.length; i++) {for (int j = 0; j < array.length-1; j++) {if(array[j] > array[j+1]) {int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;}}} }
上述代碼已能成功實現數組的排序,但仍能進一步優化,如下圖,可以發現當i = 1時,j只需從j = 0比較到j = 2(array.length - 1 - i),因為在 i = 0的排完序之后, 最后一個元素已經有序了, 無需再進行比較排序. 下圖所示過程不完整,可以自行補充完整,到時就一目了然了。 如下圖, 當 i = 1時, i = 1這一趟排完序之后發現 所有元素已經排好升序了, 那也就是說在冒泡排序過程中, 存在一種可能,就是某一趟排序就已經把所有元素排好了無需再進行后續的排序,?我們其實可以定義一個 flg 來標記這種情況,可能某一趟就把順序排好直接跳出循環,提高效率.

于是有了如下優化過的代碼:
public static void bubble(int[] array) {for (int i = 0; i < array.length; i++) {boolean flg = false;//排序前將flg賦值為falsefor (int j = 0; j < array.length-1-i; j++) {if(array[j] > array[j+1]) {int tmp = array[j];array[j] = array[j+1];array[j+1] = tmp;flg = true;//有發生交換就給flg賦為true,說明順序還沒排好}}if(flg == false) {break;}} }
3.數組逆序
public static void main(String[] args) {int[] array = {1,2,3,4,5};reverse(array);System.out.println(Arrays.toString(array)); }public static void reverse(int[] array) {int left = 0;int right = array.length - 1;while(left < right) {int tmp = array[left];array[left] = array[right];array[right] = tmp;left++;right--;} }
4.奇數位于偶數之前
調整數組順序使得奇數位于偶數之前。調整之后,不關心大小順序。
如數組:[1,2,3,4,5,6]
調整后可能是:[1, 5, 3, 4, 2, 6]
本題可以使用2個下標,一個從0下標開始,一個從最后一個下標開始。
public static void main(String[] args) {int[] array = {1,2,3,4,5};func(array);System.out.println(Arrays.toString(array)); }public static void func(int[] array) {int i = 0;int j = array.length-1;while(i < j) {while(i < j && array[i] % 2 != 0) {i++;}while(i < j && array[j] % 2 != 1) {j--;}int tmp = array[i];array[i] = array[j];array[j] = tmp;} }
5.兩數之和
給定一個整數數組 nums 和一個整數目標值 target,請你在該數組中找出 和為目標值 target?的那 兩個 整數,并返回它們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,數組中同一個元素在答案里不能重復出現。
你可以按任意順序返回答案。
示例 1:
輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1]
public static void main(String[] args) {int[] array = {2,7,11,15};int[] array1 = func(array,9);System.out.println(Arrays.toString(array1)); }public static int[] func(int[] array,int key) {for (int i = 0; i < array.length-1; i++) {for (int j = i+1; j <array.length; j++) {if(array[i] + array[j] == key) {int[] arr = {i,j};return arr;}}}return new int[]{-1,-1}; }
6.給定一個非空整數數組,除了某個元素只出現一次以外,其余每個元素均出現兩次。找出那個只出現了一次的元素。
注意:
1、n ^ n = 0;即兩個相同的數字異或是0
2、0 ^ n = n;即0和任何數字進行異或,結果就是那個任何數字。
public static void main(String[] args) {int[] array = {1,3,3,1,4,8,4};int ret = func(array);System.out.println(ret); }public static int func(int[] array) {int ret = array[0];for (int i = 1; i < array.length; i++) {ret ^= array[i];}return ret; }
7.存在連續三個奇數的數組
給你一個整數數組?arr
,請你判斷數組中是否存在連續三個元素都是奇數的情況:如果存在,請返回?true
?;否則,返回?false
?。
示例 1:
輸入:arr = [2,6,4,1]
輸出:false
解釋:不存在連續三個元素都是奇數的情況。
示例 2:
輸入:arr = [1,2,34,3,4,5,7,23,12]
輸出:true
解釋:存在連續三個元素都是奇數的情況,即 [5,7,23] 。
思路:數字是連續出現的,所以我們只需要定義一個計數器,如果連續出現的次數超過3,則返回true。
public static void main(String[] args) {int[] arr = {2,6,4,1};boolean ret = func(arr);System.out.println(ret);int[] arr1 = {1,2,34,3,4,5,7,23,12};boolean ret1 = func(arr1);System.out.println(ret1); }public static boolean func(int[] array) {int count = 0;for (int i = 0; i < array.length; i++) {if(array[i] % 2 != 0) {count++;}if(count == 3) {return true;}}return false; }