modify code on class

pull/3/head
左程云 5 years ago
parent 854e2574fe
commit 389f92c834

@ -8,11 +8,10 @@ public class Code01_SelectionSort {
if (arr == null || arr.length < 2) { if (arr == null || arr.length < 2) {
return; return;
} }
// 0 ~ N-1 // 0 ~ N-1 找到最小值在哪放到0位置上
// 1~n-1 // 1 ~ n-1 找到最小值在哪放到1 位置上
// 2 // 2 ~ n-1 找到最小值在哪放到2 位置上
for (int i = 0; i < arr.length - 1; i++) { // i ~ N-1 for (int i = 0; i < arr.length - 1; i++) {
// 最小值在哪个位置上 in-1
int minIndex = i; int minIndex = i;
for (int j = i + 1; j < arr.length; j++) { // i ~ N-1 上找最小值的下标 for (int j = i + 1; j < arr.length; j++) { // i ~ N-1 上找最小值的下标
minIndex = arr[j] < arr[minIndex] ? j : minIndex; minIndex = arr[j] < arr[minIndex] ? j : minIndex;

@ -8,8 +8,7 @@ public class Code03_InsertionSort {
if (arr == null || arr.length < 2) { if (arr == null || arr.length < 2) {
return; return;
} }
// 0~0 有序的 // 不只1个数
// 0~i 想有序
for (int i = 1; i < arr.length; i++) { // 0 ~ i 做到有序 for (int i = 1; i < arr.length; i++) { // 0 ~ i 做到有序
for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) { for (int j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
swap(arr, j, j + 1); swap(arr, j, j + 1);
@ -31,13 +30,12 @@ public class Code03_InsertionSort {
// for test // for test
public static int[] generateRandomArray(int maxSize, int maxValue) { public static int[] generateRandomArray(int maxSize, int maxValue) {
// Math.random() -> [0,1) 所有的小数,等概率返回一个 // Math.random() -> [0,1) 所有的小数,等概率返回一个
// Math.random() * N -> [0,N) 所有小数,等概率返回一个 // Math.random() * N -> [0,N) 所有小数,等概率返回一个
// (int)(Math.random() * N) -> [0,N-1] 所有的整数,等概率返回一个 // (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++) { for (int i = 0; i < arr.length; i++) {
arr[i] = (int) ((maxValue + 1) * Math.random()) arr[i] = (int) ((maxValue + 1) * Math.random()) - (int) (maxValue * Math.random());
- (int) (maxValue * Math.random());
} }
return arr; return arr;
} }
@ -91,14 +89,19 @@ public class Code03_InsertionSort {
int maxValue = 100;// 值:-100100 int maxValue = 100;// 值:-100100
boolean succeed = true; boolean succeed = true;
for (int i = 0; i < testTime; i++) { for (int i = 0; i < testTime; i++) {
int[] arr1 = generateRandomArray(maxSize, maxValue); int[] arr = generateRandomArray(maxSize, maxValue);
int[] arr2 = copyArray(arr1); int[] arr1 = copyArray(arr);
int[] arr2 = copyArray(arr);
insertionSort(arr1); insertionSort(arr1);
comparator(arr2); comparator(arr2);
if (!isEqual(arr1, arr2)) { if (!isEqual(arr1, arr2)) {
// 打印arr1 // 打印arr1
// 打印arr2 // 打印arr2
succeed = false; succeed = false;
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + " ");
}
System.out.println();
break; break;
} }
} }

@ -12,12 +12,8 @@ public class Code04_BSExist {
int R = sortedArr.length - 1; int R = sortedArr.length - 1;
int mid = 0; int mid = 0;
// L..R // L..R
while (L < R) { while (L < R) { // L..R 至少两个数的时候
// mid = (L+R) / 2; mid = L + ((R - L) >> 1);
// L 10亿 R 18亿
// mid = L + (R - L) / 2
// N / 2 N >> 1
mid = L + ((R - L) >> 1); // mid = (L + R) / 2
if (sortedArr[mid] == num) { if (sortedArr[mid] == num) {
return true; return true;
} else if (sortedArr[mid] > num) { } else if (sortedArr[mid] > num) {

@ -9,7 +9,7 @@ public class Code05_BSNearLeft {
int L = 0; int L = 0;
int R = arr.length - 1; int R = arr.length - 1;
int index = -1; // 记录最左的对号 int index = -1; // 记录最左的对号
while (L <= R) { while (L <= R) { // 至少一个数的时候
int mid = L + ((R - L) >> 1); int mid = L + ((R - L) >> 1);
if (arr[mid] >= value) { if (arr[mid] >= value) {
index = mid; index = mid;

@ -17,12 +17,14 @@ public class Code07_EvenTimesOddTimes {
for (int i = 0; i < arr.length; i++) { for (int i = 0; i < arr.length; i++) {
eor ^= arr[i]; eor ^= arr[i];
} }
// eor = a ^ b // a 和 b是两种数
// eor != 0 // eor != 0
// eor必然有一个位置上是1 // eor最右侧的1提取出来
// 0110010000 // eor : 00110010110111000
// 0000010000 // rightOne :00000000000001000
int rightOne = eor & (~eor + 1); // 提取出最右的1 int rightOne = eor & (-eor); // 提取出最右的1
int onlyOne = 0; // eor' int onlyOne = 0; // eor'
for (int i = 0 ; i < arr.length;i++) { for (int i = 0 ; i < arr.length;i++) {
// arr[1] = 111100011110000 // arr[1] = 111100011110000

@ -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<Integer, Integer> 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<Integer> 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("测试结束");
}
}

@ -3,8 +3,17 @@ package class01;
public class Test { public class Test {
public static void main(String[] args) { 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; a = a ^ b;
@ -20,6 +29,23 @@ public class Test {
int[] arr = {3,1,100}; 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[0]);
System.out.println(arr[2]); System.out.println(arr[2]);

Loading…
Cancel
Save