Skip to content

Commit a50df1a

Browse files
authored
Merge pull request doocs#42 from Mrzhudky/work
Add Solution 027[Java]
2 parents 4f19918 + 162f8e5 commit a50df1a

File tree

6 files changed

+158
-6
lines changed

6 files changed

+158
-6
lines changed

solution/025.Reverse Nodes in k-Group/README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ class Solution {
4747
if(num >= k) {
4848
num = 0;
4949
ListNode tempNode = pNode.next;
50-
reserver(lastNode.next, k);
50+
reverse(lastNode.next, k);
5151
// k 个节点的尾节点指向下一组的头节点
5252
lastNode.next.next = tempNode;
5353
// 上一组的尾节点指向当前 k 个节点的头节点
@@ -64,11 +64,11 @@ class Solution {
6464
return reNode.next;
6565
}
6666

67-
private ListNode reserver(ListNode node, int i) {
67+
private ListNode reverse(ListNode node, int i) {
6868
if(i <= 1 || node.next == null) {
6969
return node;
7070
}
71-
ListNode lastNode = reserver(node.next, i - 1);
71+
ListNode lastNode = reverse(node.next, i - 1);
7272
lastNode.next = node;
7373
return node;
7474
}

solution/025.Reverse Nodes in k-Group/Solution.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public ListNode reverseKGroup(ListNode head, int k) {
2121
if(num >= k) {
2222
num = 0;
2323
ListNode tempNode = pNode.next;
24-
reserver(lastNode.next, k);
24+
reverse(lastNode.next, k);
2525
// k 个节点的尾节点指向下一组的头节点
2626
lastNode.next.next = tempNode;
2727
// 上一组的尾节点指向当前 k 个节点的头节点
@@ -38,11 +38,11 @@ public ListNode reverseKGroup(ListNode head, int k) {
3838
return reNode.next;
3939
}
4040

41-
private ListNode reserver(ListNode node, int i) {
41+
private ListNode reverse(ListNode node, int i) {
4242
if(i <= 1 || node.next == null) {
4343
return node;
4444
}
45-
ListNode lastNode = reserver(node.next, i - 1);
45+
ListNode lastNode = reverse(node.next, i - 1);
4646
lastNode.next = node;
4747
return node;
4848
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
## 删除排序数组中的重复项
2+
### 题目描述
3+
4+
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
5+
6+
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
7+
8+
示例 1:
9+
10+
给定数组 nums = [1,1,2],
11+
12+
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
13+
14+
你不需要考虑数组中超出新长度后面的元素。
15+
示例 2:
16+
17+
给定 nums = [0,0,1,1,1,2,2,3,3,4],
18+
19+
函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
20+
21+
你不需要考虑数组中超出新长度后面的元素。
22+
说明:
23+
24+
为什么返回数值是整数,但输出的答案是数组呢?
25+
26+
请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
27+
28+
你可以想象内部操作如下:
29+
30+
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
31+
int len = removeDuplicates(nums);
32+
33+
// 在函数里修改输入数组对于调用者是可见的。
34+
// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
35+
```
36+
for (int i = 0; i < len; i++) {
37+
print(nums[i]);
38+
}
39+
```
40+
41+
### 解法
42+
1. 维护 i 和 j 两个指针,i 从左向右遍历数组, j 指针指向当前完成去除重复元素的最后一个值。
43+
2. 通过比较 nums[i] 与 nums[j] 的值判断 i 指向的元素是否为前一个元素的重复,若是,进入步骤3,否则,重复步骤2;
44+
3. j 向左移动,将 nums[i] 拷贝至 nums[j] 成为新的末尾元素。
45+
46+
```java
47+
class Solution {
48+
public int removeDuplicates(int[] nums) {
49+
if(nums == null || nums.length == 0) {
50+
return 0;
51+
}
52+
53+
int j = 0;
54+
for(int i = 1; i < nums.length; i++) {
55+
if(nums[i] != nums[j]) {
56+
nums[++j] = nums[i];
57+
}
58+
}
59+
return j + 1;
60+
}
61+
}
62+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
class Solution {
2+
public int removeDuplicates(int[] nums) {
3+
if(nums == null || nums.length == 0) {
4+
return 0;
5+
}
6+
7+
int j = 0;
8+
for(int i = 1; i < nums.length; i++) {
9+
if(nums[i] != nums[j]) {
10+
nums[++j] = nums[i];
11+
}
12+
}
13+
return j + 1;
14+
}
15+
}

solution/027.Remove Element/README.md

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
## 移除元素
2+
### 题目描述
3+
4+
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
5+
6+
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
7+
8+
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
9+
10+
示例 1:
11+
12+
给定 nums = [3,2,2,3], val = 3,
13+
14+
函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。
15+
16+
你不需要考虑数组中超出新长度后面的元素。
17+
示例 2:
18+
19+
给定 nums = [0,1,2,2,3,0,4,2], val = 2,
20+
21+
函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。
22+
23+
注意这五个元素可为任意顺序。
24+
25+
你不需要考虑数组中超出新长度后面的元素。
26+
27+
### 解法
28+
1. 维护 i 和 end 两个指针,end 指向数组尾部,i 从左向右遍历数组,
29+
2. 若 nums[i] == val, 则把数组尾部的值 nums[end] 拷贝至 i 的位置,然后将 end 指针向左移动;否则,i 向右移动,继续遍历数组。
30+
3. 这样当两个 i 与 end 相遇时,end 左边的所以 val 元素都被 end 右边的非 val 元素替换。
31+
32+
```java
33+
class Solution {
34+
public int removeElement(int[] nums, int val) {
35+
if(nums == null || nums.length == 0) {
36+
return 0;
37+
}
38+
39+
int end = nums.length - 1;
40+
int i = 0;
41+
while(i <= end) {
42+
if(nums[i] == val) {
43+
nums[i] = nums[end];
44+
end--;
45+
}
46+
else {
47+
i++;
48+
}
49+
}
50+
return end + 1;
51+
52+
}
53+
}
54+
```
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
class Solution {
2+
public int removeElement(int[] nums, int val) {
3+
if(nums == null || nums.length == 0) {
4+
return 0;
5+
}
6+
7+
int end = nums.length - 1;
8+
int i = 0;
9+
while(i <= end) {
10+
if(nums[i] == val) {
11+
nums[i] = nums[end];
12+
end--;
13+
}
14+
else {
15+
i++;
16+
}
17+
}
18+
return end + 1;
19+
20+
}
21+
}

0 commit comments

Comments
 (0)