如何避免在循环索引中使用try_into().unwrap()进行类型转换?
Rust中usize转i32的替代方案(针对two_sum场景)
在LeetCode的two_sum问题里,数组索引默认是usize类型,但题目要求返回i32类型的索引,你当前用的try_into().unwrap()是安全但略显繁琐的写法,这里给你几个更合适的替代方案:
1. 直接用as强制转换(算法题首选)
LeetCode的测试用例中,数组长度永远不会超过i32的最大值(i32能表示的最大正数是2147483647,而题目里nums的长度最多也就几万级别),所以直接用as转换完全安全,代码更简洁:
impl Solution { pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> { for i in 0..nums.len() { // 优化j的起始位置,避免重复检查j!=i,提升效率 for j in (i + 1)..nums.len() { if nums[i] + nums[j] == target { return vec![i as i32, j as i32]; } } } vec![] } }
2. 用expect()替代unwrap(),提供明确错误信息
如果想保留类型安全的检查,同时避免unwrap()模糊的panic信息,可以用expect()自定义错误提示,调试时更容易定位问题:
use std::convert::TryInto; impl Solution { pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> { for i in 0..nums.len() { for j in (i + 1)..nums.len() { if nums[i] + nums[j] == target { return vec![ i.try_into().expect("索引转换失败:数组长度超过i32可表示范围"), j.try_into().expect("索引转换失败:数组长度超过i32可表示范围") ]; } } } vec![] } }
3. 提前校验数组长度(严谨生产环境写法)
如果是在生产环境中,不确定数组长度是否会超出i32范围,可以先做一次校验,再安全转换:
impl Solution { pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> { // 提前检查数组长度是否超出i32范围 if nums.len() > i32::MAX as usize { panic!("数组长度超过i32可表示的最大范围"); } for i in 0..nums.len() { for j in (i + 1)..nums.len() { if nums[i] + nums[j] == target { return vec![i as i32, j as i32]; } } } vec![] } }
另外提一句:你原代码里的双层循环可以优化,让j从i+1开始,这样就不用每次判断j!=i,能少做很多无用的检查。
内容的提问来源于stack exchange,提问作者Alex Alvarez Gárciga
相关产品推荐
相关产品推荐

