简易型带 rust 铸造

t8e9dugd  于 2023-04-06  发布在  其他
关注(0)|答案(2)|浏览(124)
impl Solution {
      pub fn find_max_average(nums: Vec<i32>, k: i32) -> f64 {
          let mut curr:i32=0;
          let mut ans:f64;
          for i in 0..k {
             curr += nums[i as usize]; 
          }   
          ans=curr as f64/k as f64;
              
          for i in k..nums.len() as i32 {
              curr += nums[i as usize] - nums[(i-k) as usize];
              ans = ans.max(curr as f64/k as f64);
          }   
          return ans 
      }   
  }

这段代码可以工作,它是为了解决一个leetcode问题(计算子数组的最大平均值)。然而,作为一个rust的初学者,我花了很长时间来编译它-特别是,需要大量的类型转换。fn签名被给出。
这可以改进吗?rust是否意味着代码的可读性较低(在我看来,上面的内容不是那么可读)与防故障类型安全性之间的权衡?或者这只是主观的,随着代码的改进,所谓的权衡就消失了?

bxpogfeg

bxpogfeg1#

几件事让你的生活更轻松。
首先,寻找长度为k的序列的最大平均值与寻找长度为k的序列的最大和是完全相同的任务,所以你可以跳过除以k直到最后。
然后你可以引入正确类型的变量来帮助你。比如,add

let n = k as usize

因为当你做for i in 0..n的时候,你就不必把i转换成usize了。
然后去掉所有被k整除的地方,但只在最后做

ans as f64 / k as f64
goqiplq2

goqiplq22#

我第二个@cadolphs建议在函数开始时强制转换类型,以避免以后需要强制转换,尽管建议使用.into()(或.try_into())而不是as,如下所示:

let n: usize = k.try_into().unwrap();

原因是as转换的行为通常不是在极端情况下所期望的行为。
例如,如果k,则let n = k as usize将给予错误的结果(一个i32)恰好是负的,它会对值进行符号扩展,然后将其解释为正,从而产生一个巨大的n。相反,.try_into()会检查以确保k可以正确转换为usize,如果无法转换,则返回Err
一般来说,默认情况下,您可能希望使用.into()(或.try_into())进行转换,除非您完全理解as转换的行为(并且您实际上需要该行为)。

相关问题