Skip to content

Commit 0249792

Browse files
Merge pull request #23 from UCSBGauchos/master
第一周作业#8
2 parents ae250c3 + d110a44 commit 0249792

File tree

4 files changed

+114
-1
lines changed

4 files changed

+114
-1
lines changed

Week_01/id_8/Leetcode_189_8.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
class Solution {
2+
public void rotate(int[] nums, int k) {
3+
if (k > nums.length) {
4+
k = k%nums.length;
5+
}
6+
int[] rememberArray = new int[k];
7+
int j = 0;
8+
for (int i = nums.length-k; i< nums.length; i++) {
9+
rememberArray[j] = nums[i];
10+
j++;
11+
}
12+
for (int i=nums.length-k-1; i>=0; i--) {
13+
nums[i+k] = nums[i];
14+
}
15+
for (int i=0; i<k; i++) {
16+
nums[i] = rememberArray[i];
17+
}
18+
}
19+
}

Week_01/id_8/Leetcode_26_8.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
class Solution {
2+
public int removeDuplicates(int[] nums) {
3+
int numbers = 0;
4+
int arrayLength = nums.length;
5+
for (int i=0; i<arrayLength; i++) {
6+
for(int j=i+1; j<arrayLength; j++) {
7+
if(nums[i]!=nums[j]) {
8+
numbers ++;
9+
break;
10+
} else if (nums[i] == nums[j]){
11+
removeElementArray(nums, j);
12+
arrayLength = arrayLength-1;
13+
j = j-1;
14+
}
15+
}
16+
}
17+
return numbers+1;
18+
}
19+
20+
public void removeElementArray(int[] array, int index) {
21+
for (int i=index; i<array.length-1; i++) {
22+
array[i] = array[i+1];
23+
}
24+
}
25+
}

Week_01/id_8/NOTE.md

Lines changed: 70 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,70 @@
1-
# 学习笔记
1+
## 前言
2+
3+
### 题目1
4+
[Leetcode#26 移除数组中的重复元素](https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/)
5+
6+
### 难点分析
7+
> 这道题目的难点在于对空间复杂度的限制,不能使用外部辅助的数据结构,必须在原地完成这个操作。
8+
9+
### 解题思路
10+
> 首先想到先把"原地删除数组中某一个给定位置的元素"的这个方法抽象出来。由于数组对删除可添加元素并不是非常友好,这个操作的复杂度为O(n),从给定的位置index开始,每一个元素要依次等于后面的元素。这一步细节在于,由于需要有一个i+1的判断,所以i的取值上限为array.length-1。接下来的思路是明确触发这个删除操作的时机,大致的思路是,对于数组中的所有元素,用一个for循环,判断所有在它后面的元素,如果元素不相等,则将number的统计值加一,同时退出当前元素的判断。如果后面的元素和当前元素相等,就调用之前我们封装的删除特定位置的数组元素的方法,删除。这里的难点同样在于原地操作,删除后需要对原始数组有一个状态的更新。包括两部分:1.总的需要判断的数组长度减1。2.待判断元素的下表不能增加,因为已经删了一个了,所以下一个其实就是当前。
11+
12+
### 参考代码AC
13+
```Java
14+
class Solution {
15+
public int removeDuplicates(int[] nums) {
16+
int numbers = 0;
17+
int arrayLength = nums.length;
18+
for (int i=0; i<arrayLength; i++) {
19+
for(int j=i+1; j<arrayLength; j++) {
20+
if(nums[i]!=nums[j]) {
21+
numbers ++;
22+
break;
23+
} else if (nums[i] == nums[j]){
24+
removeElementArray(nums, j);
25+
arrayLength = arrayLength-1;
26+
j = j-1;
27+
}
28+
}
29+
}
30+
return numbers+1;
31+
}
32+
33+
public void removeElementArray(int[] array, int index) {
34+
for (int i=index; i<array.length-1; i++) {
35+
array[i] = array[i+1];
36+
}
37+
}
38+
}
39+
```
40+
41+
### 题目2
42+
[Leetcode#189 旋转数组](https://leetcode-cn.com/problems/rotate-array/)
43+
### 难点分析
44+
>这道题目的难点在于对空间复杂度的限制,不能使用外部辅助的数据结构,必须在原地完成这个操作。其次题目中的有些测试用例K可能大于数组长度,这样就需要引入取模操作。
45+
46+
### 解题思路
47+
>解决这种数组的题目,特别是下标操作比较绕的题目,比较好的方式就是多举一些例子。我在做这道题的时候,其实一开始没有想到要求模。有些边界的情况其实可以通过多提交几次来添加。大体的思路是首先把那些需要移到右边的节点保存下来,然后从后往前把n-k个元素移到后边,最后再把空出来的那些空位用之前保存下来的那些元素补上。
48+
49+
### 参考AC代码
50+
```Java
51+
class Solution {
52+
public void rotate(int[] nums, int k) {
53+
if (k > nums.length) {
54+
k = k%nums.length;
55+
}
56+
int[] rememberArray = new int[k];
57+
int j = 0;
58+
for (int i = nums.length-k; i< nums.length; i++) {
59+
rememberArray[j] = nums[i];
60+
j++;
61+
}
62+
for (int i=nums.length-k-1; i>=0; i--) {
63+
nums[i+k] = nums[i];
64+
}
65+
for (int i=0; i<k; i++) {
66+
nums[i] = rememberArray[i];
67+
}
68+
}
69+
}
70+
```
Binary file not shown.

0 commit comments

Comments
 (0)