From 389f92c83425511727382109f0636992940ee487 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B7=A6=E7=A8=8B=E4=BA=91?= Date: Sun, 8 Nov 2020 16:16:13 +0800 Subject: [PATCH] modify code on class --- src/class01/Code01_SelectionSort.java | 9 +- src/class01/Code03_InsertionSort.java | 19 ++-- src/class01/Code04_BSExist.java | 8 +- src/class01/Code05_BSNearLeft.java | 2 +- src/class01/Code07_EvenTimesOddTimes.java | 12 +- src/class01/Code08_KM.java | 130 ++++++++++++++++++++++ src/class01/Test.java | 30 ++++- 7 files changed, 183 insertions(+), 27 deletions(-) create mode 100644 src/class01/Code08_KM.java diff --git a/src/class01/Code01_SelectionSort.java b/src/class01/Code01_SelectionSort.java index 8bd4c27..c9b5738 100644 --- a/src/class01/Code01_SelectionSort.java +++ b/src/class01/Code01_SelectionSort.java @@ -8,11 +8,10 @@ public class Code01_SelectionSort { if (arr == null || arr.length < 2) { return; } - // 0 ~ N-1 - // 1~n-1 - // 2 - for (int i = 0; i < arr.length - 1; i++) { // i ~ N-1 - // 最小值在哪个位置上 i~n-1 + // 0 ~ N-1 找到最小值,在哪,放到0位置上 + // 1 ~ n-1 找到最小值,在哪,放到1 位置上 + // 2 ~ n-1 找到最小值,在哪,放到2 位置上 + for (int i = 0; i < arr.length - 1; i++) { int minIndex = i; for (int j = i + 1; j < arr.length; j++) { // i ~ N-1 上找最小值的下标 minIndex = arr[j] < arr[minIndex] ? j : minIndex; diff --git a/src/class01/Code03_InsertionSort.java b/src/class01/Code03_InsertionSort.java index 79861c9..7283369 100644 --- a/src/class01/Code03_InsertionSort.java +++ b/src/class01/Code03_InsertionSort.java @@ -8,8 +8,7 @@ public class Code03_InsertionSort { if (arr == null || arr.length < 2) { return; } - // 0~0 有序的 - // 0~i 想有序 + // 不只1个数 for (int i = 1; i < arr.length; i++) { // 0 ~ i 做到有序 for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { swap(arr, j, j + 1); @@ -31,13 +30,12 @@ public class Code03_InsertionSort { // for test public static int[] generateRandomArray(int maxSize, int maxValue) { - // Math.random() -> [0,1) 所有的小数,等概率返回一个 + // Math.random() -> [0,1) 所有的小数,等概率返回一个 // Math.random() * N -> [0,N) 所有小数,等概率返回一个 // (int)(Math.random() * N) -> [0,N-1] 所有的整数,等概率返回一个 - int[] arr = new int[(int) ((maxSize + 1) * Math.random())]; // 长度随机 + int[] arr = new int[(int) ((maxSize + 1) * Math.random())]; // 长度随机 for (int i = 0; i < arr.length; i++) { - arr[i] = (int) ((maxValue + 1) * Math.random()) - - (int) (maxValue * Math.random()); + arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random()); } return arr; } @@ -91,14 +89,19 @@ public class Code03_InsertionSort { int maxValue = 100;// 值:-100~100 boolean succeed = true; for (int i = 0; i < testTime; i++) { - int[] arr1 = generateRandomArray(maxSize, maxValue); - int[] arr2 = copyArray(arr1); + int[] arr = generateRandomArray(maxSize, maxValue); + int[] arr1 = copyArray(arr); + int[] arr2 = copyArray(arr); insertionSort(arr1); comparator(arr2); if (!isEqual(arr1, arr2)) { // 打印arr1 // 打印arr2 succeed = false; + for (int j = 0; j < arr.length; j++) { + System.out.print(arr[j] + " "); + } + System.out.println(); break; } } diff --git a/src/class01/Code04_BSExist.java b/src/class01/Code04_BSExist.java index 49bc7f2..d89be00 100644 --- a/src/class01/Code04_BSExist.java +++ b/src/class01/Code04_BSExist.java @@ -12,12 +12,8 @@ public class Code04_BSExist { int R = sortedArr.length - 1; int mid = 0; // L..R - while (L < R) { - // mid = (L+R) / 2; - // L 10亿 R 18亿 - // mid = L + (R - L) / 2 - // N / 2 N >> 1 - mid = L + ((R - L) >> 1); // mid = (L + R) / 2 + while (L < R) { // L..R 至少两个数的时候 + mid = L + ((R - L) >> 1); if (sortedArr[mid] == num) { return true; } else if (sortedArr[mid] > num) { diff --git a/src/class01/Code05_BSNearLeft.java b/src/class01/Code05_BSNearLeft.java index 6737501..eaf5804 100644 --- a/src/class01/Code05_BSNearLeft.java +++ b/src/class01/Code05_BSNearLeft.java @@ -9,7 +9,7 @@ public class Code05_BSNearLeft { int L = 0; int R = arr.length - 1; int index = -1; // 记录最左的对号 - while (L <= R) { + while (L <= R) { // 至少一个数的时候 int mid = L + ((R - L) >> 1); if (arr[mid] >= value) { index = mid; diff --git a/src/class01/Code07_EvenTimesOddTimes.java b/src/class01/Code07_EvenTimesOddTimes.java index d9e9327..713d512 100644 --- a/src/class01/Code07_EvenTimesOddTimes.java +++ b/src/class01/Code07_EvenTimesOddTimes.java @@ -17,12 +17,14 @@ public class Code07_EvenTimesOddTimes { for (int i = 0; i < arr.length; i++) { eor ^= arr[i]; } - // eor = a ^ b + // a 和 b是两种数 // eor != 0 - // eor必然有一个位置上是1 - // 0110010000 - // 0000010000 - int rightOne = eor & (~eor + 1); // 提取出最右的1 + // eor最右侧的1,提取出来 + // eor : 00110010110111000 + // rightOne :00000000000001000 + int rightOne = eor & (-eor); // 提取出最右的1 + + int onlyOne = 0; // eor' for (int i = 0 ; i < arr.length;i++) { // arr[1] = 111100011110000 diff --git a/src/class01/Code08_KM.java b/src/class01/Code08_KM.java new file mode 100644 index 0000000..4755646 --- /dev/null +++ b/src/class01/Code08_KM.java @@ -0,0 +1,130 @@ +package class01; + +import java.util.HashMap; +import java.util.HashSet; + +public class Code08_KM { + + public static int test(int[] arr, int k, int m) { + HashMap map = new HashMap<>(); + for (int num : arr) { + if (map.containsKey(num)) { + map.put(num, map.get(num) + 1); + } else { + map.put(num, 1); + } + } + for (int num : map.keySet()) { + if (map.get(num) == k) { + return num; + } + } + return -1; + } + + // 请保证arr中,只有一种数出现了K次,其他数都出现了M次 + public static int onlyKTimes(int[] arr, int k, int m) { + int[] t = new int[32]; + // t[0] 0位置的1出现了几个 + // t[i] i位置的1出现了几个 + for (int num : arr) { + for (int i = 0; i <= 31; i++) { + t[i] += (num >> i) & 1; + } + } + int ans = 0; + for (int i = 0; i < 32; i++) { + if (t[i] % m == 0) { + continue; + } + if (t[i] % m == k) { + ans |= (1 << i); + } else { + return -1; + } + } + if (ans == 0) { + int count = 0; + for (int num : arr) { + if (num == 0) { + count++; + } + } + if (count != k) { + return -1; + } + } + return ans; + } + + public static int[] randomArray(int maxKinds, int range, int k, int m) { + int ktimeNum = randomNumber(range); + // 真命天子出现的次数 + int times = Math.random() < 0.5 ? k : ((int) (Math.random() * (m - 1)) + 1); + // 2 + int numKinds = (int) (Math.random() * maxKinds) + 2; + // k * 1 + (numKinds - 1) * m + int[] arr = new int[times + (numKinds - 1) * m]; + int index = 0; + for (; index < times; index++) { + arr[index] = ktimeNum; + } + numKinds--; + HashSet set = new HashSet<>(); + set.add(ktimeNum); + while (numKinds != 0) { + int curNum = 0; + do { + curNum = randomNumber(range); + } while (set.contains(curNum)); + set.add(curNum); + numKinds--; + for (int i = 0; i < m; i++) { + arr[index++] = curNum; + } + } + // arr 填好了 + for (int i = 0; i < arr.length; i++) { + // i 位置的数,我想随机和j位置的数做交换 + int j = (int) (Math.random() * arr.length);// 0 ~ N-1 + int tmp = arr[i]; + arr[i] = arr[j]; + arr[j] = tmp; + } + return arr; + } + + // [-range, +range] + public static int randomNumber(int range) { + return ((int) (Math.random() * range) + 1) - ((int) (Math.random() * range) + 1); + } + + public static void main(String[] args) { + int kinds = 4; + int range = 200; + int testTime = 100000; + int max = 9; + System.out.println("测试开始"); + for (int i = 0; i < testTime; i++) { + int a = (int) (Math.random() * max) + 1; // a 1 ~ 9 + int b = (int) (Math.random() * max) + 1; // b 1 ~ 9 + int k = Math.min(a, b); + int m = Math.max(a, b); + // k < m + if (k == m) { + m++; + } + int[] arr = randomArray(kinds, range, k, m); + int ans1 = test(arr, k, m); + int ans2 = onlyKTimes(arr, k, m); + if (ans1 != ans2) { + System.out.println(ans1); + System.out.println(ans2); + System.out.println("出错了!"); + } + } + System.out.println("测试结束"); + + } + +} diff --git a/src/class01/Test.java b/src/class01/Test.java index af227e6..a968933 100644 --- a/src/class01/Test.java +++ b/src/class01/Test.java @@ -3,8 +3,17 @@ package class01; public class Test { public static void main(String[] args) { - int a = 6; - int b = 6; + + + + + + + int a = 16; + int b = 603; + + System.out.println(a); + System.out.println(b); a = a ^ b; @@ -20,6 +29,23 @@ public class Test { int[] arr = {3,1,100}; + int i = 0; + int j = 0; + + arr[i] = arr[i] ^ arr[j]; + arr[j] = arr[i] ^ arr[j]; + arr[i] = arr[i] ^ arr[j]; + + System.out.println(arr[i] + " , " + arr[j]); + + + + + + + + + System.out.println(arr[0]); System.out.println(arr[2]);