Implemented p17 and p18
This commit is contained in:
parent
8ea2584a1b
commit
4e4fad9311
3 changed files with 103 additions and 0 deletions
|
@ -14,3 +14,5 @@ pub mod p13_roman_to_integer;
|
|||
pub mod p14_longest_common_prefix;
|
||||
pub mod p15_3sum;
|
||||
pub mod p16_3sum_closest;
|
||||
pub mod p17_letter_combinations_of_a_phone_number;
|
||||
pub mod p18_4sum;
|
||||
|
|
46
src/p17_letter_combinations_of_a_phone_number.rs
Normal file
46
src/p17_letter_combinations_of_a_phone_number.rs
Normal file
|
@ -0,0 +1,46 @@
|
|||
pub struct Solution;
|
||||
impl Solution {
|
||||
const LETTER_GROUPS: [&'static[char]; 8] = [
|
||||
&['a','b','c'], &['d','e','f'], &['g','h','i'],
|
||||
&['j','k','l'], &['m','n','o'], &['p','q','r','s'],
|
||||
&['t','u','v'], &['w','x','y','z']
|
||||
];
|
||||
|
||||
pub fn letter_combinations(digits: String) -> Vec<String> {
|
||||
if digits.is_empty() { return vec![]; }
|
||||
let mut result = vec!["".to_string()];
|
||||
for b in digits.bytes() {
|
||||
let group_index = b - b'0' - 2;
|
||||
let group = Self::LETTER_GROUPS[group_index as usize];
|
||||
let extend_size = result.len();
|
||||
for _ in 0..group.len()-1 { result.extend_from_within(..extend_size); }
|
||||
for (i, s) in result.iter_mut().enumerate() {
|
||||
let index = i / extend_size;
|
||||
s.push(group[index]);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test1() {
|
||||
let mut actual = Solution::letter_combinations("23".to_string());
|
||||
actual.sort();
|
||||
assert_eq!(actual, vec![
|
||||
"ad".to_string(), "ae".to_string(), "af".to_string(),
|
||||
"bd".to_string(), "be".to_string(), "bf".to_string(),
|
||||
"cd".to_string(), "ce".to_string(), "cf".to_string()
|
||||
]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test2() {
|
||||
assert_eq!(Solution::letter_combinations(String::new()), Vec::<String>::new());
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test3() {
|
||||
assert_eq!(Solution::letter_combinations("2".to_string()),
|
||||
vec!["a".to_string(), "b".to_string(), "c".to_string()]);
|
||||
}
|
55
src/p18_4sum.rs
Normal file
55
src/p18_4sum.rs
Normal file
|
@ -0,0 +1,55 @@
|
|||
pub struct Solution;
|
||||
impl Solution {
|
||||
pub fn four_sum(mut nums: Vec<i32>, target: i32) -> Vec<Vec<i32>> {
|
||||
let mut result = vec![];
|
||||
if nums.len() < 4 { return result; }
|
||||
nums.sort();
|
||||
for i in 0..nums.len()-3 {
|
||||
if i > 0 && nums[i - 1] == nums[i] { continue; }
|
||||
for j in i+1..nums.len()-2 {
|
||||
if j > i + 1 && nums[j - 1] == nums[j] { continue; }
|
||||
let (mut k, mut l) = (j + 1, nums.len() - 1);
|
||||
while k < l {
|
||||
if k > j + 1 && nums[k - 1] == nums[k] {
|
||||
k += 1; continue;
|
||||
}
|
||||
if l < nums.len() - 1 && nums[l + 1] == nums[l] {
|
||||
l -= 1; continue;
|
||||
}
|
||||
// num is in range [-10^9; 10^9], possibility of overflow
|
||||
let Some(sum) = (nums[i] + nums[j]).checked_add(nums[k] + nums[l])
|
||||
else { k += 1; continue; };
|
||||
match (sum - target).signum() {
|
||||
-1 => { k += 1; },
|
||||
1 => { l -= 1; },
|
||||
0 => {
|
||||
result.push(vec![nums[i], nums[j], nums[k], nums[l]]);
|
||||
k += 1; l -= 1;
|
||||
},
|
||||
_ => ()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test1() {
|
||||
let mut actual = Solution::four_sum(vec![1,0,-1,0,-2,2], 0);
|
||||
actual.iter_mut().for_each(|v| v.sort());
|
||||
assert_eq!(actual, vec![
|
||||
vec![-2,-1,1,2], vec![-2,0,0,2], vec![-1,0,0,1]
|
||||
]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test2() {
|
||||
assert_eq!(Solution::four_sum(vec![2,2,2,2,2], 8), vec![vec![2,2,2,2]]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test3() {
|
||||
assert_eq!(Solution::four_sum(vec![1000000000,1000000000,1000000000,1000000000], -294967296), Vec::<Vec<i32>>::new());
|
||||
}
|
Loading…
Reference in a new issue