diff --git a/src/leo/class01/BSAwesome.java b/src/leo/class01/BSAwesome.java index 053eefc..4bf6e8f 100644 --- a/src/leo/class01/BSAwesome.java +++ b/src/leo/class01/BSAwesome.java @@ -68,6 +68,14 @@ public class BSAwesome { return -1; } + /** + * 功能描述 : 重头遍历 + * @author Leo + * @date 2020/11/14 4:14 下午 + * @param arr + * @throw + * @return int + */ public static int testBSAwesome(int[] arr) { if (arr.length == 0 || arr == null) { return -1; @@ -98,6 +106,32 @@ public class BSAwesome { } + public static int BSAwesome2(int[] arr) { + if (arr.length == 0 || arr == null) { + return -1; + } + if (arr.length == 1||arr[0] < arr[1]) { + return 0; + } + if (arr[arr.length-1] < arr[arr.length-2]) { + return arr.length - 1; + } + int L = 0; + int R = arr.length - 1; + int mid = 0; + while (L <= R) { + mid = L + ((R - L) >> 1); + if (arr[mid] > arr[mid + 1]) { + L = mid + 1; + } else if (arr[mid] > arr[mid - 1]) { + R = mid - 1; + }else { + return mid; + } + } + return -1; + + } @@ -138,7 +172,7 @@ public class BSAwesome { boolean succeed = true; for (int i = 0; i < testTime; i++) { int[] arr = ArrayUtil.randomAdjacentNotEqualArray(maxSize, range); - final int index = BSAwesome1(arr); + final int index = BSAwesome2(arr); final int verifyIndex = verifyBSAwesome(arr,index); if (index != verifyIndex) { succeed = false; diff --git a/src/leo/class01/BSExist.java b/src/leo/class01/BSExist.java index ecad36d..01fcf01 100644 --- a/src/leo/class01/BSExist.java +++ b/src/leo/class01/BSExist.java @@ -14,7 +14,7 @@ import java.util.Arrays; public class BSExist { /** - * 功能描述 : 二分查找某数是否存在 + * 功能描述 : 在有序数组中,二分查找某数是否存在 * @author Leo * @date 2020/11/12 10:36 上午 * @param arr 有序数组 @@ -87,6 +87,28 @@ public class BSExist { } + public static boolean exist4(int[] arr, int value) { + if (arr.length == 0 || arr == null) { + return false; + } + int L = 0; + int R = arr.length - 1; + int mid = 0; + + while (L < R) { + mid = L + ((R - L) >> 1); + if (arr[mid] > value) { + R = mid - 1; + } else if (arr[mid] < value) { + L = mid - 1; + }else{ + return true; + } + } + return arr[L] == value; + } + + /** * 功能描述 : test * @author Leo @@ -109,13 +131,13 @@ public class BSExist { int maxSize = 50; int range = 500; - int testTime = 10; + int testTime = 1000; boolean succeed = true; for (int i = 0; i < testTime; i++) { int[] sortArr = ArrayUtil.randomSortArray(maxSize, range); int value = (int) ((range + 1) * Math.random() - (range + 1) * Math.random()); - if (exist3(sortArr, value) != exist(sortArr, value)) { + if (exist4(sortArr, value) != exist(sortArr, value)) { succeed = false; ArrayUtil.printArr(sortArr); break; diff --git a/src/leo/class01/BSNear.java b/src/leo/class01/BSNear.java index 98f49b3..5bb7cee 100644 --- a/src/leo/class01/BSNear.java +++ b/src/leo/class01/BSNear.java @@ -84,6 +84,26 @@ public class BSNear { } + public static int BSNearLeft4(int[] arr, int value) { + if (arr.length == 0 || arr == null) { + return -1; + } + int L = 0; + int R = arr.length - 1; + int mid = 0; + int index = -1; + while (L <= R) { + mid = L + ((R - L) >> 1); + if (arr[mid] >= value) { + index = mid; + R = mid - 1; + }else{ + L = mid + 1; + } + } + return index; + } + /** * 功能描述 : 在有序数组中找出>=某个数最左侧的位置(for test) @@ -160,6 +180,28 @@ public class BSNear { return index; } + + public static int BSNearRight3(int[] arr, int value) { + if (arr.length == 0 || arr == null) { + return -1; + } + + int L = 0; + int R = arr.length - 1; + int index = -1; + int mid = 0; + while (L <= 2) { + mid = L + ((R - L) >> 1); + if (arr[mid] <= value) { + index = mid; + L = mid + 1; + }else { + R = mid - 1; + } + } + return index; + } + public static int forTestBSNearRight(int[] arr, int value) { int index = -1; if (arr == null || arr.length == 0) { @@ -182,7 +224,7 @@ public class BSNear { for (int i = 0; i < testTime; i++) { int[] sortArr = ArrayUtil.randomSortArray(maxSize, range); int value = (int) ((range + 1) * Math.random() - (range + 1) * Math.random()); - /*final int res1 = BSNearLeft3(sortArr, value); + final int res1 = BSNearLeft4(sortArr, value); final int res2 = forTestBSNearLeft(sortArr, value); if (res1 != res2) { success = false; @@ -190,8 +232,8 @@ public class BSNear { System.out.println("BSNearLeft=" + res1); System.out.println("forTestBSNearLeft=" + res2); break; - }*/ - final int res3 = BSNearRight(sortArr, value); + } + /*final int res3 = BSNearRight(sortArr, value); final int res4 = forTestBSNearRight(sortArr, value); if (res3 != res4) { success = false; @@ -199,7 +241,7 @@ public class BSNear { System.out.println("BSNearRight=" + res3); System.out.println("forTestBSNearRight=" + res4); break; - } + }*/ } System.out.println(success ? "Nice!!" : "Fucking Fucked!"); } diff --git a/src/leo/class01/BubbleSort.java b/src/leo/class01/BubbleSort.java index 30caf0f..dddb215 100644 --- a/src/leo/class01/BubbleSort.java +++ b/src/leo/class01/BubbleSort.java @@ -14,6 +14,7 @@ public class BubbleSort { /** * 功能描述 : 冒泡算法 O(n²) + * 将最大的数放到后面 * @author Leo * @date 2020/11/11 10:09 下午 * @param arr @@ -60,7 +61,34 @@ public class BubbleSort { } } - public static void bubbleSort4(int[] arr) { + public static void bubbleSort4(int[] arr) { + if (arr.length < 2 || arr == null) { + return; + } + for (int i = arr.length - 1; i > 0; i--) { + for (int j = 0; j < i; j++) { + if (arr[j] > arr[j + 1]) { + swap(arr, j, j + 1); + } + } + } + } + + public static void bubbleSort5(int[] arr){ + if (arr.length < 2 || arr == null) { + return; + } + for (int i = arr.length - 1; i > 0; i--) { + for (int j = 0; j < i; j++) { + if (arr[j] > arr[j + 1]) { + swap(arr, j, j + 1); + } + } + } + } + + + public static void bubbleSort6(int[] arr) { if (arr.length < 2 || arr == null) { return; } @@ -103,7 +131,7 @@ public class BubbleSort { for (int i = 0; i < testOfTime; i++) { int[] arr = ArrayUtil.randomArray(maxSize, range); int[] anotherArr = ArrayUtil.copyArray(arr); - bubbleSort4(arr); + bubbleSort6(arr); Arrays.sort(anotherArr); if (!ArrayUtil.isEqual(arr, anotherArr)) { succeed = false; diff --git a/src/leo/class01/EvenTimesOddTimes.java b/src/leo/class01/EvenTimesOddTimes.java new file mode 100644 index 0000000..96e1569 --- /dev/null +++ b/src/leo/class01/EvenTimesOddTimes.java @@ -0,0 +1,77 @@ +package leo.class01; + +/** + * @author Leo + * @ClassName EvenTimesOddTimes + * @DATE 2020/11/13 3:34 下午 + * @Description + */ +public class EvenTimesOddTimes { + + /** + * 功能描述 : 取出唯一一个出现奇数次的数字 + * @author Leo + * @date 2020/11/13 4:28 下午 + * @param arr + * @throw + * @return void + */ + public static void printOdd(int[] arr) { + int eor = 0; + for (int i = 0; i < arr.length; i++) { + eor ^= arr[i]; + } + System.out.println(eor); + } + + public static void printOdd1(int[] arr) { + int eor = 0; + for (int i = 0; i < arr.length; i++) { + eor ^= arr[i]; + } + System.out.println(eor); + } + + + /** + * 功能描述 : 有两种数出现了奇数次,找出他 + * @author Leo + * @date 2020/11/14 4:21 下午 + * @param arr + * @throw + * @return void + */ + public static void printOddTwo(int[] arr) { + int eor = 0; + for (int i = 0; i < arr.length; i++) { + eor ^= arr[i]; + } + int rightOnly = eor & (-eor); + + int eorOther = 0; + for (int i = 0; i < arr.length; i++) { + if ((rightOnly & arr[i]) != 0) { + eorOther ^= arr[i]; + } + } + System.out.println(eorOther + " " + (eor ^ eorOther)); + } + + public static void printOddTwo2(int[] arr) { + int eor = 0; + for (int i = 0; i < arr.length; i++) { + eor ^= arr[i]; + } + int rightOne = eor & (-eor); + + int eorOther = 0; + for (int i = 0; i < arr.length; i++) { + if ((rightOne & arr[i]) != 0) { + eorOther ^= arr[i]; + } + } + System.out.println(eorOther + " " + (eor ^ eorOther)); + + } + +} diff --git a/src/leo/class01/InsertionSort.java b/src/leo/class01/InsertionSort.java index ed91e3e..9814034 100644 --- a/src/leo/class01/InsertionSort.java +++ b/src/leo/class01/InsertionSort.java @@ -66,6 +66,29 @@ public class InsertionSort { } } + public static void insertionSort4(int[] arr) { + if (arr.length < 2 || arr == null) { + return; + } + for (int i = 1; i < arr.length; i++) { + for (int j = i-1; j >= 0 && arr[j] > arr[j + 1]; j--) { + swap(arr, j, j+1); + + } + } + } + + + public static void insertionSort5(int[] arr){ + if (arr == null || arr.length < 0) { + return; + } + for (int i = 1; i < arr.length; i++) { + for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { + swap(arr, j, j + 1); + } + } + } private static void swap(int[] arr, int i, int j) { if (arr == null @@ -86,12 +109,12 @@ public class InsertionSort { public static void main(String[] args){ int maxSize = 50; int range = 80; - int testOfTime = 100000; + int testOfTime = 1000; boolean succeed = true; for (int i = 0; i < testOfTime; i++) { int[] arr = ArrayUtil.randomArray(maxSize, range); int[] anotherArr = ArrayUtil.copyArray(arr); - insertionSort3(arr); + insertionSort5(arr); Arrays.sort(anotherArr); if (!ArrayUtil.isEqual(arr, anotherArr)) { succeed = false; diff --git a/src/leo/class01/SelectionSort.java b/src/leo/class01/SelectionSort.java index 2b2819e..bb196e2 100644 --- a/src/leo/class01/SelectionSort.java +++ b/src/leo/class01/SelectionSort.java @@ -95,6 +95,33 @@ public class SelectionSort { } + public static void selectionSort6(int[] arr) { + if (arr == null || arr.length == 0) { + return; + } + for (int i = 0; i < arr.length - 1; i++) { + for (int j = i + 1; j < arr.length; j++) { + if (arr[i] > arr[j]) { + swap(arr, i, j); + } + } + } + } + + + public static void selectionSort7(int[] arr) { + if (arr == null || arr.length == 0) { + return; + } + for (int i = 0; i < arr.length - 1; i++) { + for (int j = i + 1; j < arr.length; j++) { + if (arr[i] > arr[j]) { + swap(arr, i, j); + } + } + } + } + /** * 功能描述 : 交换 @@ -121,12 +148,12 @@ public class SelectionSort { public static void main(String[] args){ int maxSize = 100; int range = 50; - int testOfTime = 20; + int testOfTime = 1000; boolean succeed = true; for (int i = 0; i < testOfTime; i++) { int[] arr = ArrayUtil.randomArray(maxSize, range); int[] anotherArr = ArrayUtil.copyArray(arr); - selectionSort5(arr); + selectionSort7(arr); Arrays.sort(anotherArr); if (!ArrayUtil.isEqual(arr, anotherArr)) { succeed = false;