Skip to content

Commit 1b15857

Browse files
committed
其他解法
1 parent b39fca2 commit 1b15857

File tree

7 files changed

+370
-0
lines changed

7 files changed

+370
-0
lines changed
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package com.chen.algorithm.study.offer.test29;
2+
3+
import java.util.Arrays;
4+
5+
/**
6+
* @Auther: zhunn
7+
* @Date: 2020/10/10 13:58
8+
* @Description: 顺时针从外往里打印矩阵(螺旋矩阵,力扣第54题)
9+
*/
10+
public class Solution {
11+
12+
public static int[] spiralOrder(int[][] matrix) {
13+
if (matrix.length == 0) {
14+
return new int[0];
15+
}
16+
int[] res = new int[matrix.length * matrix[0].length];
17+
int u = 0, d = matrix.length - 1, l = 0, r = matrix[0].length - 1;
18+
int idx = 0;
19+
while (true) {
20+
for (int i = l; i <= r; i++) {
21+
res[idx++] = matrix[u][i];
22+
}
23+
if (++u > d) {
24+
break;
25+
}
26+
for (int i = u; i <= d; i++) {
27+
res[idx++] = matrix[i][r];
28+
}
29+
if (--r < l) {
30+
break;
31+
}
32+
for (int i = r; i >= l; i--) {
33+
res[idx++] = matrix[d][i];
34+
}
35+
if (--d < u) {
36+
break;
37+
}
38+
for (int i = d; i >= u; i--) {
39+
res[idx++] = matrix[i][l];
40+
}
41+
if (++l > r) {
42+
break;
43+
}
44+
}
45+
return res;
46+
}
47+
48+
private static int[] spiralOrder1(int[][] matrix) {
49+
if (matrix == null || matrix.length == 0) return new int[0];
50+
51+
int numEle = matrix.length * matrix[0].length;
52+
int[] result = new int[numEle];
53+
int idx = 0;
54+
int left = 0, right = matrix[0].length - 1, top = 0, bottom = matrix.length - 1;
55+
56+
while (numEle >= 1) {
57+
for (int i = left; i <= right && numEle >= 1; i++) {
58+
result[idx++] = matrix[top][i];
59+
numEle--;
60+
}
61+
top++;
62+
for (int i = top; i <= bottom && numEle >= 1; i++) {
63+
result[idx++] = matrix[i][right];
64+
numEle--;
65+
}
66+
right--;
67+
for (int i = right; i >= left && numEle >= 1; i--) {
68+
result[idx++] = matrix[bottom][i];
69+
numEle--;
70+
}
71+
bottom--;
72+
for (int i = bottom; i >= top && numEle >= 1; i--) {
73+
result[idx++] = matrix[i][left];
74+
numEle--;
75+
}
76+
left++;
77+
}
78+
return result;
79+
}
80+
81+
public static void main(String[] args) {
82+
int[][] matrix = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
83+
int[] res = spiralOrder1(matrix);
84+
System.out.println(Arrays.toString(res));
85+
}
86+
87+
}

src/main/java/com/chen/algorithm/study/test1/Solution.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,15 @@
66
* 正确
77
* @author : chen weijie
88
* @Date: 2019-09-02 23:52
9+
* @Description: 两数之和
910
*/
1011
public class Solution {
1112

1213
public int[] twoSum(int[] nums, int target) {
14+
if (nums == null || nums.length == 0) {
15+
return new int[0];
16+
}
17+
1318
for (int i = 0; i < nums.length; i++) {
1419
for (int j = i + 1; j < nums.length; j++) {
1520
if (nums[i] + nums[j] == target) {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package com.chen.algorithm.study.test26;
2+
3+
import org.junit.Test;
4+
5+
import java.util.Arrays;
6+
7+
/**
8+
* @Auther: zhunn
9+
* @Date: 2020/10/10 16:23
10+
* @Description: 删除排序数组中的重复项,返回新数组长度。双指针法
11+
*/
12+
public class Solution3 {
13+
14+
/**
15+
* 双指针法 ,数组是一个引用
16+
*
17+
* @param nums
18+
* @return
19+
*/
20+
public int removeDuplicates(int[] nums) {
21+
if (nums == null || nums.length == 0) return 0;
22+
23+
int i = 0;
24+
for (int j = 0; j < nums.length; j++) {
25+
if (nums[j] != nums[i]) {
26+
i++;
27+
nums[i] = nums[j];
28+
}
29+
}
30+
//System.out.println(Arrays.toString(nums));
31+
return i + 1;
32+
}
33+
34+
@Test
35+
public void test() {
36+
System.out.println(removeDuplicates(new int[]{0, 0, 1, 1, 2, 3, 4, 5, 5, 6}));
37+
}
38+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.chen.algorithm.study.test27;
2+
3+
import org.junit.Test;
4+
5+
import java.util.Arrays;
6+
7+
/**
8+
* @Auther: zhunn
9+
* @Date: 2020/10/10 16:40
10+
* @Description: 移除元素,双指针法
11+
*/
12+
public class Solution2 {
13+
14+
public int removeElement(int[] nums, int val) {
15+
if (nums == null || nums.length == 0) return 0;
16+
17+
int i = 0;
18+
for (int j = 0; j < nums.length; j++) {
19+
if (nums[j] != val) {
20+
nums[i] = nums[j];
21+
i++;
22+
}
23+
}
24+
System.out.println(Arrays.toString(nums));
25+
return i;
26+
}
27+
28+
@Test
29+
public void test() {
30+
System.out.println(removeElement(new int[]{1, 1, 2, 2, 3, 5, 6, 7, 8}, 2));
31+
}
32+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.chen.algorithm.study.test34;
2+
3+
import org.junit.Test;
4+
5+
import java.util.Arrays;
6+
7+
/**
8+
* @Auther: zhunn
9+
* @Date: 2020/10/10 17:04
10+
* @Description: 在排序数组中查找元素的第一个和最后一个位置
11+
* (可使用二分查找到第一个与target相等元素和最后一个与target相等元素 方式,返回下标)
12+
*/
13+
public class Solution4 {
14+
15+
/**
16+
* 当key=array[mid]时, 往左边一个一个逼近,right = mid -1; 返回left
17+
*
18+
* @param nums
19+
* @param target
20+
* @return
21+
*/
22+
private int leftIndex(int[] nums, int target) {
23+
if (nums == null || nums.length == 0) {
24+
return -1;
25+
}
26+
27+
int left = 0, right = nums.length - 1;
28+
while (left <= right) {
29+
int mid = (right - left) / 2 + left;
30+
if (nums[mid] >= target) {
31+
right = mid - 1;
32+
} else {
33+
left = mid + 1;
34+
}
35+
}
36+
37+
if (left <= nums.length - 1 && nums[left] == target) {
38+
return left;
39+
}
40+
return -1;
41+
}
42+
43+
/**
44+
* 当key=array[mid]时, 往右边一个一个逼近,left = mid + 1; 返回right
45+
*
46+
* @param nums
47+
* @param target
48+
* @return
49+
*/
50+
private int rightIndex(int[] nums, int target) {
51+
if (nums == null || nums.length == 0) {
52+
return -1;
53+
}
54+
int left = 0, right = nums.length - 1;
55+
while (left <= right) {
56+
int mid = (right - left) / 2 + left;
57+
if (nums[mid] <= target) {
58+
left = mid + 1;
59+
} else {
60+
right = mid - 1;
61+
}
62+
}
63+
if (right >= 0 && nums[right] == target) {
64+
return right;
65+
}
66+
return -1;
67+
}
68+
69+
public int[] find(int[] nums, int target) {
70+
int[] res = new int[2];
71+
res[0] = leftIndex(nums, target);
72+
res[1] = rightIndex(nums, target);
73+
return res;
74+
}
75+
76+
@Test
77+
public void test() {
78+
int[] nums = new int[]{5, 7, 7, 8, 8, 8, 10};
79+
int[] res = find(nums, 8);
80+
System.out.println(Arrays.toString(res));
81+
}
82+
83+
}

src/main/java/com/chen/algorithm/study/test69/Solution.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
/**
66
* @author : chen weijie
77
* @Date: 2020-05-03 09:39
8+
* @Description: x的平方根,舍弃小数
89
*/
910
public class Solution {
1011

Lines changed: 124 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
package com.chen.algorithm.study.test72;
2+
3+
/**
4+
* @Auther: zhunn
5+
* @Date: 2020/10/9 13:54
6+
* @Description: 编辑距离算法
7+
* 距离值:变更次数--- 先计算两个字符串的差异, str1 str2, str1要做多少次(每次一个char字符)增加 删除 替换 操作 才能与str2一致
8+
* 相似度:用最长的字符串的len 减去 变更次数 ,然后除以最长的字符串长度. similarity = (maxLen - changeTimes)/maxLen
9+
* ORACLE函数: UTL_MATCH.EDIT_DISTANCE
10+
* select UTL_MATCH.EDIT_DISTANCE('Java你好','你好') from dual;
11+
*/
12+
public class Solution2 {
13+
14+
15+
/**
16+
* 编辑距离算法
17+
*
18+
* @param sourceStr 原字符串
19+
* @param targetStr 目标字符串
20+
* @return 返回最小距离: 原字符串需要变更多少次才能与目标字符串一致(变更动作:增加/删除/替换,每次都是以字节为单位)
21+
*/
22+
public static int minDistance(String sourceStr, String targetStr) {
23+
int sourceLen = sourceStr.length();
24+
int targetLen = targetStr.length();
25+
26+
if (sourceLen == 0) {
27+
return targetLen;
28+
}
29+
if (targetLen == 0) {
30+
return sourceLen;
31+
}
32+
33+
//定义矩阵(二维数组)
34+
int[][] arr = new int[sourceLen + 1][targetLen + 1];
35+
36+
for (int i = 0; i < sourceLen + 1; i++) {
37+
arr[i][0] = i;
38+
}
39+
for (int j = 0; j < targetLen + 1; j++) {
40+
arr[0][j] = j;
41+
}
42+
43+
//矩阵打印
44+
System.out.println("初始化矩阵打印开始");
45+
for (int i = 0; i < sourceLen + 1; i++) {
46+
47+
for (int j = 0; j < targetLen + 1; j++) {
48+
System.out.print(arr[i][j] + "\t");
49+
}
50+
System.out.println();
51+
}
52+
System.out.println("初始化矩阵打印结束");
53+
54+
for (int i = 1; i < sourceLen + 1; i++) {
55+
for (int j = 1; j < targetLen + 1; j++) {
56+
57+
if (sourceStr.charAt(i - 1) == targetStr.charAt(j - 1)) {
58+
/*
59+
* 如果source[i] 等于target[j],则:d[i, j] = d[i-1, j-1] + 0 (递推式 1)
60+
*/
61+
arr[i][j] = arr[i - 1][j - 1];
62+
} else {
63+
/* 如果source[i] 不等于target[j],则根据插入、删除和替换三个策略,分别计算出使用三种策略得到的编辑距离,然后取最小的一个:
64+
d[i, j] = min(d[i, j - 1] + 1, d[i - 1, j] + 1, d[i - 1, j - 1] + 1 ) (递推式 2)
65+
>> d[i, j - 1] + 1 表示对source[i]执行插入操作后计算最小编辑距离
66+
>> d[i - 1, j] + 1 表示对source[i]执行删除操作后计算最小编辑距离
67+
>> d[i - 1, j - 1] + 1表示对source[i]替换成target[i]操作后计算最小编辑距离
68+
*/
69+
arr[i][j] = (Math.min(Math.min(arr[i - 1][j], arr[i][j - 1]), arr[i - 1][j - 1])) + 1;
70+
}
71+
}
72+
}
73+
74+
System.out.println("----------矩阵打印---------------");
75+
//矩阵打印
76+
for (int i = 0; i < sourceLen + 1; i++) {
77+
78+
for (int j = 0; j < targetLen + 1; j++) {
79+
System.out.print(arr[i][j] + "\t");
80+
}
81+
System.out.println();
82+
}
83+
System.out.println("----------矩阵打印---------------");
84+
85+
return arr[sourceLen][targetLen];
86+
}
87+
88+
/**
89+
* 计算字符串相似度
90+
* similarity = (maxlen - distance) / maxlen
91+
* ps: 数据定义为double类型,如果为int类型 相除后结果为0(只保留整数位)
92+
*
93+
* @param str1
94+
* @param str2
95+
* @return
96+
*/
97+
public static double getsimilarity(String str1, String str2) {
98+
double distance = minDistance(str1, str2);
99+
double maxlen = Math.max(str1.length(), str2.length());
100+
double res = (maxlen - distance) / maxlen;
101+
102+
//System.out.println("distance="+distance);
103+
//System.out.println("maxlen:"+maxlen);
104+
//System.out.println("(maxlen - distance):"+(maxlen - distance));
105+
return res;
106+
}
107+
108+
public static String evaluate(String str1, String str2) {
109+
double result = getsimilarity(str1, str2);
110+
return String.valueOf(result);
111+
}
112+
113+
public static void main(String[] args) {
114+
String str1 = "2/F20NGNT";
115+
String str2 = "1/F205ONGNT";
116+
int result = minDistance(str1, str2);
117+
//String res = evaluate(str1, str2);
118+
System.out.println("最小编辑距离minDistance:" + result);
119+
//System.out.println(str1 + "与" + str2 + "相似度为:" + res);
120+
121+
122+
}
123+
124+
}

0 commit comments

Comments
 (0)