From 63bcdb798aea4143a445a8f7183e813e55cf8004 Mon Sep 17 00:00:00 2001 From: rongyi Date: Fri, 24 May 2024 16:21:17 +0800 Subject: [PATCH] [Rust] make rust part more idomatic and fix panic of backtrack template (#1370) * Drop unused variable * Idiomatic rust * Fix panic template --- .../chapter_array_and_linkedlist/array.rs | 1 - .../preorder_traversal_i_compact.rs | 8 +++--- .../preorder_traversal_ii_compact.rs | 10 +++---- .../preorder_traversal_iii_compact.rs | 10 +++---- .../preorder_traversal_iii_template.rs | 26 +++++++++---------- 5 files changed, 27 insertions(+), 28 deletions(-) diff --git a/codes/rust/chapter_array_and_linkedlist/array.rs b/codes/rust/chapter_array_and_linkedlist/array.rs index c529105a3..5d779e402 100644 --- a/codes/rust/chapter_array_and_linkedlist/array.rs +++ b/codes/rust/chapter_array_and_linkedlist/array.rs @@ -74,7 +74,6 @@ fn find(nums: &[i32], target: i32) -> Option { fn main() { /* 初始化数组 */ let arr: [i32; 5] = [0; 5]; - let slice: &[i32] = &[0; 5]; print!("数组 arr = "); print_util::print_array(&arr); // 在 Rust 中,指定长度时([i32; 5])为数组,不指定长度时(&[i32])为切片 diff --git a/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs b/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs index 462197c7f..489668760 100644 --- a/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs +++ b/codes/rust/chapter_backtracking/preorder_traversal_i_compact.rs @@ -10,7 +10,7 @@ use std::{cell::RefCell, rc::Rc}; use tree_node::{vec_to_tree, TreeNode}; /* 前序遍历:例题一 */ -fn pre_order(res: &mut Vec>>, root: Option>>) { +fn pre_order(res: &mut Vec>>, root: Option<&Rc>>) { if root.is_none() { return; } @@ -19,8 +19,8 @@ fn pre_order(res: &mut Vec>>, root: Option>>>, path: &mut Vec>>, - root: Option>>, + root: Option<&Rc>>, ) { if root.is_none() { return; @@ -25,10 +25,10 @@ fn pre_order( // 记录解 res.push(path.clone()); } - pre_order(res, path, node.borrow().left.clone()); - pre_order(res, path, node.borrow().right.clone()); + pre_order(res, path, node.borrow().left.as_ref()); + pre_order(res, path, node.borrow().right.as_ref()); // 回退 - path.remove(path.len() - 1); + path.pop(); } } @@ -41,7 +41,7 @@ pub fn main() { // 前序遍历 let mut path = Vec::new(); let mut res = Vec::new(); - pre_order(&mut res, &mut path, root); + pre_order(&mut res, &mut path, root.as_ref()); println!("\n输出所有根节点到节点 7 的路径"); for path in res { diff --git a/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs b/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs index 1c834fe64..db5a27e3b 100644 --- a/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs +++ b/codes/rust/chapter_backtracking/preorder_traversal_iii_compact.rs @@ -13,7 +13,7 @@ use tree_node::{vec_to_tree, TreeNode}; fn pre_order( res: &mut Vec>>>, path: &mut Vec>>, - root: Option>>, + root: Option<&Rc>>, ) { // 剪枝 if root.is_none() || root.as_ref().unwrap().borrow().val == 3 { @@ -26,10 +26,10 @@ fn pre_order( // 记录解 res.push(path.clone()); } - pre_order(res, path, node.borrow().left.clone()); - pre_order(res, path, node.borrow().right.clone()); + pre_order(res, path, node.borrow().left.as_ref()); + pre_order(res, path, node.borrow().right.as_ref()); // 回退 - path.remove(path.len() - 1); + path.pop(); } } @@ -42,7 +42,7 @@ pub fn main() { // 前序遍历 let mut path = Vec::new(); let mut res = Vec::new(); - pre_order(&mut res, &mut path, root); + pre_order(&mut res, &mut path, root.as_ref()); println!("\n输出所有根节点到节点 7 的路径,路径中不包含值为 3 的节点"); for path in res { diff --git a/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs b/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs index f100f23cc..8be605238 100644 --- a/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs +++ b/codes/rust/chapter_backtracking/preorder_traversal_iii_template.rs @@ -11,7 +11,7 @@ use tree_node::{vec_to_tree, TreeNode}; /* 判断当前状态是否为解 */ fn is_solution(state: &mut Vec>>) -> bool { - return !state.is_empty() && state.get(state.len() - 1).unwrap().borrow().val == 7; + return !state.is_empty() && state.last().unwrap().borrow().val == 7; } /* 记录解 */ @@ -23,8 +23,8 @@ fn record_solution( } /* 判断在当前状态下,该选择是否合法 */ -fn is_valid(_: &mut Vec>>, choice: Rc>) -> bool { - return choice.borrow().val != 3; +fn is_valid(_: &mut Vec>>, choice: Option<&Rc>>) -> bool { + return choice.is_some() && choice.unwrap().borrow().val != 3; } /* 更新状态 */ @@ -34,13 +34,13 @@ fn make_choice(state: &mut Vec>>, choice: Rc>>, _: Rc>) { - state.remove(state.len() - 1); + state.pop(); } /* 回溯算法:例题三 */ fn backtrack( state: &mut Vec>>, - choices: &mut Vec>>, + choices: &Vec>>>, res: &mut Vec>>>, ) { // 检查是否为解 @@ -49,22 +49,22 @@ fn backtrack( record_solution(state, res); } // 遍历所有选择 - for choice in choices { + for &choice in choices.iter() { // 剪枝:检查选择是否合法 - if is_valid(state, choice.clone()) { + if is_valid(state, choice) { // 尝试:做出选择,更新状态 - make_choice(state, choice.clone()); + make_choice(state, choice.unwrap().clone()); // 进行下一轮选择 backtrack( state, - &mut vec![ - choice.borrow().left.clone().unwrap(), - choice.borrow().right.clone().unwrap(), + &vec![ + choice.unwrap().borrow().left.as_ref(), + choice.unwrap().borrow().right.as_ref(), ], res, ); // 回退:撤销选择,恢复到之前的状态 - undo_choice(state, choice.clone()); + undo_choice(state, choice.unwrap().clone()); } } } @@ -77,7 +77,7 @@ pub fn main() { // 回溯算法 let mut res = Vec::new(); - backtrack(&mut Vec::new(), &mut vec![root.unwrap()], &mut res); + backtrack(&mut Vec::new(), &mut vec![root.as_ref()], &mut res); println!("\n输出所有根节点到节点 7 的路径,要求路径中不包含值为 3 的节点"); for path in res {