Skip to content

Commit f8e41b7

Browse files
committed
feat: add tests
1 parent 9fffb11 commit f8e41b7

File tree

5 files changed

+84
-12
lines changed

5 files changed

+84
-12
lines changed

Cargo.lock

+4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -48,4 +48,5 @@ members = [
4848
"my_calendar_i",
4949
"stone_game_vii",
5050
"minumum_number_of_refueling_stops",
51+
"palindrome_pairs",
5152
]

minumum_number_of_refueling_stops/src/lib.rs

+28-12
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,38 @@
1+
use std::collections::BinaryHeap;
2+
13
pub struct Solution {}
24

35
impl Solution {
46
pub fn min_refuel_stops(target: i32, start_fuel: i32, stations: Vec<Vec<i32>>) -> i32 {
5-
let mut furthest = vec![0; stations.len() + 1]; // furthest distance after ith refueling
6-
furthest[0] = start_fuel;
7-
for i in 0..stations.len() {
8-
for t in 0..i + 1 {
9-
if furthest[t] >= stations[i][0] {
10-
furthest[t + 1] = furthest[t + 1].max(furthest[t] + stations[i][1]);
11-
}
7+
/*!
8+
* 解释可以查看[这个讨论](https://leetcode.com/problems/minimum-number-of-refueling-stops/discuss/294025/Java-Simple-Code-Greedy)。
9+
*
10+
* 主要思路:
11+
*
12+
* 把可以到达的最远距离中的所有站点的加油量加入优先队列备选,从中找到最大的加油量并弹出(避免重复加油),用以延长最远距离。
13+
* 最远距离延长后,可以选择的加油站也就增多了。将新增的可选加油站的加油量将钻石优先队列。
14+
*
15+
* 循环往复直到到达目标。
16+
*
17+
* 如果达到某个最远距离但是已经没有可以备选的加油站了,那么说明到不了终点。
18+
*/
19+
let mut stops = 0;
20+
let mut furthest = start_fuel;
21+
let mut i = 0;
22+
let mut pq = BinaryHeap::new(); // 备选的加油量
23+
while furthest < target {
24+
while i < stations.len() && stations[i][0] <= furthest {
25+
pq.push(stations[i][1]);
26+
i += 1;
1227
}
13-
}
14-
for (t, d) in furthest.iter().enumerate() {
15-
if *d >= target {
16-
return t as i32;
28+
if pq.is_empty() {
29+
// 永远到不了 target
30+
return -1;
1731
}
32+
furthest += pq.pop().unwrap(); // 弹出备选的最大加油量,延长最远距离
33+
stops += 1;
1834
}
19-
-1
35+
stops
2036
}
2137
}
2238

palindrome_pairs/Cargo.toml

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
[package]
2+
name = "palindrome_pairs"
3+
version = "0.1.0"
4+
authors = ["Ryan Li <conbas2019@gmail.com>"]
5+
edition = "2018"
6+
7+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
8+
9+
[dependencies]

palindrome_pairs/src/lib.rs

+42
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
pub struct Solution {}
2+
3+
impl Solution {
4+
pub fn palindrome_pairs(words: Vec<String>) -> Vec<Vec<i32>> {}
5+
}
6+
7+
#[cfg(test)]
8+
mod tests {
9+
use super::*;
10+
11+
fn as_expected(words: Vec<&str>, expected: Vec<[i32; 2]>) {
12+
let result = Solution::palindrome_pairs(words.iter().map(|x| x.to_string()).collect());
13+
result.sort();
14+
let expected_vector = expected
15+
.iter()
16+
.map(|x| x.to_vec())
17+
.collect::<Vec<Vec<i32>>>();
18+
expected_vector.sort();
19+
assert_eq!(result, expected_vector);
20+
}
21+
22+
#[test]
23+
fn example_1() {
24+
let words = ["abcd", "dcba", "lls", "s", "sssll"];
25+
let expected = [[0, 1], [1, 0], [3, 2], [2, 4]];
26+
as_expected(words.to_vec(), expected.to_vec());
27+
}
28+
29+
#[test]
30+
fn example_2() {
31+
let words = ["bat", "tab", "cat"];
32+
let expected = [[0, 1], [1, 0]];
33+
as_expected(words.to_vec(), expected.to_vec());
34+
}
35+
36+
#[test]
37+
fn example_3() {
38+
let words = ["a", ""];
39+
let expected = [[0, 1], [1, 0]];
40+
as_expected(words.to_vec(), expected.to_vec());
41+
}
42+
}

0 commit comments

Comments
 (0)