今天在練習 2197. Replace Non-Coprime Numbers in Array 時,需要使用到 GCD 跟 LCM,在 C++/Python 都有官方支援,Rust 跟 Go 都沒有支援,有點意外。
impl Solution {
pub fn replace_non_coprimes(nums: Vec<i32>) -> Vec<i32> {
let mut arr = Vec::with_capacity(nums.len());
let mut curr = nums[0];
let gcd = |mut a: i32, mut b: i32| -> i32 {
if a < b {
(a, b) = (b, a);
}
while b != 0 {
(a, b) = (b, a % b);
}
a
};
let lcm = |a: i32, b: i32| -> i32 {
a / gcd(a, b) * b
};
for &num in &nums[1..] {
if gcd(num, curr) > 1 {
curr = lcm(num, curr);
while let Some(&last) = arr.last() && gcd(curr, last) > 1 {
curr = lcm(last, curr);
arr.pop();
}
} else {
arr.push(curr);
curr = num;
}
}
arr.push(curr);
arr
}
}
這裡還剛好可以使用到 Rust 1.88 版本才開始有支援的 Let chains
,Let chains
讓程式碼的表示更直白,真是太棒了。
if let Channel::Stable(v) = release_info()
&& let Semver { major, minor, .. } = v
&& major == 1
&& minor == 88
{
println!("`let_chains` was stabilized in this version");
}
沒有留言:
張貼留言