我正在努力寻找一种方法从矢量的末尾取两个值,对这些值求和,并将和推送到矢量.
我发现pop,truncate和drain不工作,因为他们从原来的矢量取出值.
fn main() {
println!("Which Fibonacci number would you like to find?");
let mut fib_num = String::new();
io::stdin().read_line(&mut fib_num)
.expect("Failed to read line");
let fib_num: u32 = fib_num.trim().parse()
.expect("Please enter a number");
let mut stored_nums: Vec<u32> = vec![0, 1];
while fib_num > stored_nums.len() as u32 {
let mut limit = stored_nums.len();
let mut new_num1 = stored_nums.pop().unwrap();
let mut new_num2 = stored_nums.pop().unwrap_or(0);
stored_nums.push(new_num1 + new_num2);
}
}
Run Code Online (Sandbox Code Playgroud)
Gre*_*ird 10
要检索最后 n 个元素,只需将其转换为切片即可。
例如获取最后 3 个元素:
let v = vec![0, 1, 2, 3, 4, 5, 6, 7, 8, 9];
let last3 = v.as_slice()[v.len()-3..].to_vec();
println!("{:?}", last3); // [7, 8, 9]
Run Code Online (Sandbox Code Playgroud)
您需要考虑向量没有两个项目的情况.
我会使用迭代器适配器像Iterator::rev和Iterator::take,然后用完成Iterator::sum:
let sum = stored_nums.iter().rev().take(2).sum();
stored_nums.push(sum);
Run Code Online (Sandbox Code Playgroud)
这允许您避免显式处理vector/slice/iterator太短但代码仍然隐式处理它的情况.
您也可以直接索引切片:
let len = stored_nums.len();
let sum = stored_nums[len - 1] + stored_nums[len - 2];
stored_nums.push(sum);
Run Code Online (Sandbox Code Playgroud)
但是,如果少于2个元素,则会发生混乱.
你可以尝试在这种情况下处理太短的向量,但它并不漂亮:
let len = stored_nums.len();
let idx_a = len.checked_sub(1);
let idx_b = len.checked_sub(2);
let a = idx_a.and_then(|idx| stored_nums.get(idx).cloned());
let b = idx_b.and_then(|idx| stored_nums.get(idx).cloned());
let sum = a.unwrap_or(0) + b.unwrap_or(0);
stored_nums.push(sum);
Run Code Online (Sandbox Code Playgroud)
请注意,使用Fibonacci迭代器可能更好,只需collect将其用于Vec.
| 归档时间: |
|
| 查看次数: |
1936 次 |
| 最近记录: |