Skip to content

Commit ece3a9f

Browse files
author
Zhang Xiaodong
committed
solve 26, 27
1 parent 671aaff commit ece3a9f

File tree

3 files changed

+164
-0
lines changed

3 files changed

+164
-0
lines changed

src/solution/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,5 @@ mod s0022_generate_parentheses;
2121
mod s0023_merge_k_sorted_lists;
2222
mod s0024_swap_nodes_in_pairs;
2323
mod s0025_reverse_nodes_in_k_group;
24+
mod s0026_remove_duplicates_from_sorted_array;
25+
mod s0027_remove_element;
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
/**
2+
* [26] 删除有序数组中的重复项
3+
*
4+
* 给你一个 升序排列 的数组 nums ,请你<a href="http://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95" target="_blank"> 原地</a> 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
5+
* 考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:
6+
*
7+
* 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
8+
* 返回 k 。
9+
*
10+
* 判题标准:
11+
* 系统会用下面的代码来测试你的题解:
12+
*
13+
* int[] nums = [...]; // 输入数组
14+
* int[] expectedNums = [...]; // 长度正确的期望答案
15+
* int k = removeDuplicates(nums); // 调用
16+
* assert k == expectedNums.length;
17+
* for (int i = 0; i < k; i++) {
18+
* assert nums[i] == expectedNums[i];
19+
* }
20+
* 如果所有断言都通过,那么您的题解将被 通过。
21+
*
22+
* <strong class="example">示例 1:
23+
*
24+
* 输入:nums = [1,1,2]
25+
* 输出:2, nums = [1,2,_]
26+
* 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
27+
*
28+
* <strong class="example">示例 2:
29+
*
30+
* 输入:nums = [0,0,1,1,1,2,2,3,3,4]
31+
* 输出:5, nums = [0,1,2,3,4]
32+
* 解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
33+
*
34+
*
35+
* 提示:
36+
*
37+
* 1 <= nums.length <= 3 * 10^4
38+
* -10^4 <= nums[i] <= 10^4
39+
* nums 已按 升序 排列
40+
*
41+
*/
42+
pub struct Solution {}
43+
44+
// problem: https://leetcode.cn/problems/remove-duplicates-from-sorted-array/
45+
// discuss: https://leetcode.cn/problems/remove-duplicates-from-sorted-array/discuss/?currentPage=1&orderBy=most_votes&query=
46+
47+
// submission codes start here
48+
49+
impl Solution {
50+
pub fn remove_duplicates(nums: &mut Vec<i32>) -> i32 {
51+
if nums.len() < 2 {
52+
return nums.len() as i32;
53+
}
54+
55+
let (mut i, mut j) = (0, 0);
56+
while i < nums.len() {
57+
while j < nums.len() && nums[i] == nums[j] {
58+
j += 1;
59+
}
60+
if j >= nums.len() || j <= i {
61+
break;
62+
}
63+
nums[i+1] = nums[j];
64+
i += 1;
65+
}
66+
i as i32 + 1
67+
}
68+
}
69+
70+
// submission codes end
71+
72+
#[cfg(test)]
73+
mod tests {
74+
use super::*;
75+
76+
#[test]
77+
fn test_26() {
78+
let mut num = vec![1,1,2];
79+
assert_eq!(Solution::remove_duplicates(&mut num), 2);
80+
81+
let mut num = vec![0,0,1,1,1,2,2,3,3,4];
82+
assert_eq!(Solution::remove_duplicates(&mut num), 5);
83+
}
84+
}

src/solution/s0027_remove_element.rs

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
/**
2+
* [27] 移除元素
3+
*
4+
* 给你一个数组 nums 和一个值 val,你需要 <a href="https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95" target="_blank">原地</a> 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
5+
* 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 <a href="https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95" target="_blank">原地 </a>修改输入数组。
6+
* 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
7+
*
8+
* 说明:
9+
* 为什么返回数值是整数,但输出的答案是数组呢?
10+
* 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
11+
* 你可以想象内部操作如下:
12+
*
13+
* // nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝
14+
* int len = removeElement(nums, val);
15+
* // 在函数里修改输入数组对于调用者是可见的。
16+
* // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
17+
* for (int i = 0; i < len; i++) {
18+
*     print(nums[i]);
19+
* }
20+
*
21+
*
22+
* 示例 1:
23+
*
24+
* 输入:nums = [3,2,2,3], val = 3
25+
* 输出:2, nums = [2,2]
26+
* 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
27+
*
28+
* 示例 2:
29+
*
30+
* 输入:nums = [0,1,2,2,3,0,4,2], val = 2
31+
* 输出:5, nums = [0,1,4,0,3]
32+
* 解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。
33+
*
34+
*
35+
* 提示:
36+
*
37+
* 0 <= nums.length <= 100
38+
* 0 <= nums[i] <= 50
39+
* 0 <= val <= 100
40+
*
41+
*/
42+
pub struct Solution {}
43+
44+
// problem: https://leetcode.cn/problems/remove-element/
45+
// discuss: https://leetcode.cn/problems/remove-element/discuss/?currentPage=1&orderBy=most_votes&query=
46+
47+
// submission codes start here
48+
49+
impl Solution {
50+
pub fn remove_element(nums: &mut Vec<i32>, val: i32) -> i32 {
51+
let mut j = 0;
52+
for i in (0..nums.len()) {
53+
if nums[i] != val {
54+
nums[j] = nums[i];
55+
j += 1;
56+
}
57+
}
58+
j as i32
59+
}
60+
}
61+
62+
// submission codes end
63+
64+
#[cfg(test)]
65+
mod tests {
66+
use std::vec;
67+
68+
use super::*;
69+
70+
#[test]
71+
fn test_27() {
72+
let mut nums = vec![3, 2, 2, 3];
73+
assert_eq!(Solution::remove_element(&mut nums, 3), 2);
74+
75+
let mut nums = vec![0, 1, 2, 2, 3, 0, 4, 2];
76+
assert_eq!(Solution::remove_element(&mut nums, 2), 5);
77+
}
78+
}

0 commit comments

Comments
 (0)