From 5a844f34bbde436a5fe6260343c6b1fe80cdfa16 Mon Sep 17 00:00:00 2001 From: Mrzhudky <1183260441@qq.com> Date: Sat, 20 Oct 2018 10:52:51 +0800 Subject: [PATCH 1/3] Correct My poor English: "reserver" -> "reverse" --- solution/025.Reverse Nodes in k-Group/README.md | 6 +++--- solution/025.Reverse Nodes in k-Group/Solution.java | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/solution/025.Reverse Nodes in k-Group/README.md b/solution/025.Reverse Nodes in k-Group/README.md index bff2530691674..8ace3513c7f09 100644 --- a/solution/025.Reverse Nodes in k-Group/README.md +++ b/solution/025.Reverse Nodes in k-Group/README.md @@ -47,7 +47,7 @@ class Solution { if(num >= k) { num = 0; ListNode tempNode = pNode.next; - reserver(lastNode.next, k); + reverse(lastNode.next, k); // k 个节点的尾节点指向下一组的头节点 lastNode.next.next = tempNode; // 上一组的尾节点指向当前 k 个节点的头节点 @@ -64,11 +64,11 @@ class Solution { return reNode.next; } - private ListNode reserver(ListNode node, int i) { + private ListNode reverse(ListNode node, int i) { if(i <= 1 || node.next == null) { return node; } - ListNode lastNode = reserver(node.next, i - 1); + ListNode lastNode = reverse(node.next, i - 1); lastNode.next = node; return node; } diff --git a/solution/025.Reverse Nodes in k-Group/Solution.java b/solution/025.Reverse Nodes in k-Group/Solution.java index 2ce87c33268d3..5ece347d1a758 100644 --- a/solution/025.Reverse Nodes in k-Group/Solution.java +++ b/solution/025.Reverse Nodes in k-Group/Solution.java @@ -21,7 +21,7 @@ public ListNode reverseKGroup(ListNode head, int k) { if(num >= k) { num = 0; ListNode tempNode = pNode.next; - reserver(lastNode.next, k); + reverse(lastNode.next, k); // k 个节点的尾节点指向下一组的头节点 lastNode.next.next = tempNode; // 上一组的尾节点指向当前 k 个节点的头节点 @@ -38,11 +38,11 @@ public ListNode reverseKGroup(ListNode head, int k) { return reNode.next; } - private ListNode reserver(ListNode node, int i) { + private ListNode reverse(ListNode node, int i) { if(i <= 1 || node.next == null) { return node; } - ListNode lastNode = reserver(node.next, i - 1); + ListNode lastNode = reverse(node.next, i - 1); lastNode.next = node; return node; } From 15586905f4c2a48ba16632c2c41e08e9b156d13f Mon Sep 17 00:00:00 2001 From: Mrzhudky <1183260441@qq.com> Date: Mon, 22 Oct 2018 10:43:54 +0800 Subject: [PATCH 2/3] Add Solution 027[Java] --- solution/027.Remove Element/README.md | 54 +++++++++++++++++++++++ solution/027.Remove Element/Solution.java | 21 +++++++++ 2 files changed, 75 insertions(+) create mode 100644 solution/027.Remove Element/README.md create mode 100644 solution/027.Remove Element/Solution.java diff --git a/solution/027.Remove Element/README.md b/solution/027.Remove Element/README.md new file mode 100644 index 0000000000000..ec405976e8e39 --- /dev/null +++ b/solution/027.Remove Element/README.md @@ -0,0 +1,54 @@ +## 移除元素 +### 题目描述 + +给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。 + +不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 + +元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。 + +示例 1: + +给定 nums = [3,2,2,3], val = 3, + +函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 + +你不需要考虑数组中超出新长度后面的元素。 +示例 2: + +给定 nums = [0,1,2,2,3,0,4,2], val = 2, + +函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。 + +注意这五个元素可为任意顺序。 + +你不需要考虑数组中超出新长度后面的元素。 + +### 解法 +1. 维护 i 和 end 两个指针,end 指向数组尾部,i 从左向右遍历数组, +2. 若 nums[i] == val, 则把数组尾部的值 nums[end] 拷贝至 i 的位置,然后将 end 指针向左移动;否则,i 向右移动,继续遍历数组。 +3. 这样当两个 i 与 end 相遇时,end 左边的所以 val 元素都被 end 右边的非 val 元素替换。 + +```java +class Solution { + public int removeElement(int[] nums, int val) { + if(nums == null || nums.length == 0) { + return 0; + } + + int end = nums.length - 1; + int i = 0; + while(i <= end) { + if(nums[i] == val) { + nums[i] = nums[end]; + end--; + } + else { + i++; + } + } + return end + 1; + + } +} +``` \ No newline at end of file diff --git a/solution/027.Remove Element/Solution.java b/solution/027.Remove Element/Solution.java new file mode 100644 index 0000000000000..292e3f4686e0f --- /dev/null +++ b/solution/027.Remove Element/Solution.java @@ -0,0 +1,21 @@ +class Solution { + public int removeElement(int[] nums, int val) { + if(nums == null || nums.length == 0) { + return 0; + } + + int end = nums.length - 1; + int i = 0; + while(i <= end) { + if(nums[i] == val) { + nums[i] = nums[end]; + end--; + } + else { + i++; + } + } + return end + 1; + + } +} \ No newline at end of file From 162f8e593d4e48b52f09b302246f12c0b29041a9 Mon Sep 17 00:00:00 2001 From: Mrzhudky <1183260441@qq.com> Date: Mon, 22 Oct 2018 11:10:02 +0800 Subject: [PATCH 3/3] Add solution 026[Java] --- .../README.md | 62 +++++++++++++++++++ .../Solution.java | 15 +++++ 2 files changed, 77 insertions(+) create mode 100644 solution/026.Remove Duplicates from Sorted Array/README.md create mode 100644 solution/026.Remove Duplicates from Sorted Array/Solution.java diff --git a/solution/026.Remove Duplicates from Sorted Array/README.md b/solution/026.Remove Duplicates from Sorted Array/README.md new file mode 100644 index 0000000000000..511da7127c0b2 --- /dev/null +++ b/solution/026.Remove Duplicates from Sorted Array/README.md @@ -0,0 +1,62 @@ +## 删除排序数组中的重复项 +### 题目描述 + +给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 + +不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。 + +示例 1: + +给定数组 nums = [1,1,2], + +函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 + +你不需要考虑数组中超出新长度后面的元素。 +示例 2: + +给定 nums = [0,0,1,1,1,2,2,3,3,4], + +函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。 + +你不需要考虑数组中超出新长度后面的元素。 +说明: + +为什么返回数值是整数,但输出的答案是数组呢? + +请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 + +你可以想象内部操作如下: + +// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 +int len = removeDuplicates(nums); + +// 在函数里修改输入数组对于调用者是可见的。 +// 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。 +``` +for (int i = 0; i < len; i++) { + print(nums[i]); +} +``` + +### 解法 +1. 维护 i 和 j 两个指针,i 从左向右遍历数组, j 指针指向当前完成去除重复元素的最后一个值。 +2. 通过比较 nums[i] 与 nums[j] 的值判断 i 指向的元素是否为前一个元素的重复,若是,进入步骤3,否则,重复步骤2; +3. j 向左移动,将 nums[i] 拷贝至 nums[j] 成为新的末尾元素。 + +```java +class Solution { + public int removeDuplicates(int[] nums) { + if(nums == null || nums.length == 0) { + return 0; + } + + int j = 0; + for(int i = 1; i < nums.length; i++) { + if(nums[i] != nums[j]) { + nums[++j] = nums[i]; + } + } + return j + 1; + } +} +``` \ No newline at end of file diff --git a/solution/026.Remove Duplicates from Sorted Array/Solution.java b/solution/026.Remove Duplicates from Sorted Array/Solution.java new file mode 100644 index 0000000000000..0409fbd04328c --- /dev/null +++ b/solution/026.Remove Duplicates from Sorted Array/Solution.java @@ -0,0 +1,15 @@ +class Solution { + public int removeDuplicates(int[] nums) { + if(nums == null || nums.length == 0) { + return 0; + } + + int j = 0; + for(int i = 1; i < nums.length; i++) { + if(nums[i] != nums[j]) { + nums[++j] = nums[i]; + } + } + return j + 1; + } +} \ No newline at end of file