Rust中如何不移动列表实现反转?优化回文检测函数避免clone
无需使用
clone()的回文检测实现方法 有几种更高效且避免clone()的实现方式,推荐优先使用第一种:
方法一:直接利用迭代器比较(最优解)
不需要将字符收集到Vec中,直接通过chars()迭代器的eq()方法和反转迭代器比对,完全避免额外内存分配:
fn is_palindrome(num: String) -> bool { num.chars().eq(num.chars().rev()) }
String的chars()返回的迭代器实现了DoubleEndedIterator,rev()可以直接生成反转后的迭代器,eq()会逐个比对两个迭代器的元素,逻辑简洁且性能最优。
方法二:基于Vec的引用迭代器比对
如果已经将字符收集到Vec中,可以通过不可变引用迭代器来避免克隆整个向量:
fn is_palindrome(num: String) -> bool { let nums: Vec<char> = num.chars().collect(); nums.iter().eq(nums.iter().rev()) }
这里iter()获取的是向量中元素的不可变引用迭代器,rev()反转的是引用迭代器而非整个向量,因此不需要clone(),eq()会自动比对引用指向的元素值。
方法三:手动比对前后半部分
通过索引直接比对向量前后对应位置的元素,提前返回结果:
fn is_palindrome(num: String) -> bool { let nums: Vec<char> = num.chars().collect(); let len = nums.len(); for i in 0..len / 2 { if nums[i] != nums[len - 1 - i] { return false; } } true }
这种方式只遍历向量的前半部分,一旦发现不匹配就立即返回,在非回文场景下可能更快。
内容的提问来源于stack exchange,提问作者all_caps
相关产品推荐
相关产品推荐

