java实现常见算法

二分查找


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 二分查找
*
* 数据源是有序的
* 1. 取数据源中间位置元素与目标值对比
* 2. 如果相等则返回结果,如果小于目标值则在数据源前半部分搜索,否则在后半部分搜索
* 3. 重复执行 步骤 1、2,直至找到结果或者再没有可搜索的区间
*/
public static int binSearch(int[] array, int start, int end, int value) {
if (null == array) {
throw new RuntimeException("array is null");
}
if (start < 0 || end >= array.length) {
throw new RuntimeException("index out of bounds");
}
if (start >= end) {
return -1;
}
int mid = (start + end) >> 1;
if (array[mid] > value) {
return binSearch(array, start, mid, value);
} else if (array[mid] < value) {
return binSearch(array, mid, end, value);
} else {
return mid;
}
}

空格替换为指定字符串


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* 空格替换为指定字符串
* 1. 遍历字符串,获取空格个数
* 2. 根据空格数,计算新字符串长度,并初始化新长度字符数组
* 3. 从后往前将原字符串设置到新长度字符串数组,遇到空格设置指定字符串
* 4. 将字符数组转换为目标字符串
*/
public static String replaceBlackChar(String source, String replace) {
if (source == null) {
return null;
}
if (replace == null) {
return null;
}
int blank = 0;
for (int i = 0; i < source.length(); i++) {
if (source.charAt(i) == ' ') {
blank++;
}
}
char[] target = new char[source.length() + (replace.length() - 1) * blank];
int pos = target.length - 1;
for (int i = source.length() - 1; i >= 0; i--) {
if (source.charAt(i) == ' ') {
for (int j = replace.length() - 1; j >= 0; j--) {
target[pos--] = replace.charAt(j);
}
} else {
target[pos--] = source.charAt(i);
}
}
return new String(target);
}

字符串全排列


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* 字符串全排列
* 1. 将源字符串转化为字符数组
* 2. 循环递归替换 depth 和 depth 以后的元素
* 3. 当 depth 等于 字符串长度时,打印字符数组
*/
public static void permutationStr(String source) {
permutationStr(source.toCharArray(), 0, source.length());
}

private static void permutationStr(char[] source, int depth, int length) {
if (depth == length) {
System.out.println(source);
return;
}
char tmp;
for (int i = depth; i < length; i++) {
tmp = source[i];
source[i] = source[depth];
source[depth] = tmp;
permutationStr(source, depth + 1, length);
tmp = source[i];
source[i] = source[depth];
source[depth] = tmp;
}
}

字符串第一个只出现一次的字符


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
* 第一个只出现一次的字符
* 1. 字符的范围时 0 ~ 255,定义长度为 256 的int数组,下标只是字符内容
* 2. 遍历一趟字符串,分别设置字符出现次数
* 3. 再次遍历字符串,查询字符出现次数,第一个出现次数为1的字符即为所找
*/
private static void firstNotRepeat(String source) {
if (source == null) {
return;
}
firstNotRepeat(source.toCharArray(), source.length());
}

private static void firstNotRepeat(char[] chars, int length) {
int[] table = new int[256];
Arrays.fill(table, 0);
for (int i = 0; i < length; i++) {
table[chars[i]]++;
}
for (int i = 0; i < length; i++) {
if (table[chars[i]] == 1) {
System.out.println(chars[i]);
return;
}
}
}





文章目录
  1. 1. 二分查找
  2. 2. 空格替换为指定字符串
  3. 3. 字符串全排列
  4. 4. 字符串第一个只出现一次的字符