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是否意味着代码的可读性较低(在我看来,上面的内容不是那么可读)与防故障类型安全性之间的权衡?或者这只是主观的,随着代码的改进,所谓的权衡就消失了?
2条答案
按热度按时间bxpogfeg1#
几件事让你的生活更轻松。
首先,寻找长度为
k
的序列的最大平均值与寻找长度为k
的序列的最大和是完全相同的任务,所以你可以跳过除以k
直到最后。然后你可以引入正确类型的变量来帮助你。比如,add
因为当你做
for i in 0..n
的时候,你就不必把i
转换成usize
了。然后去掉所有被
k
整除的地方,但只在最后做goqiplq22#
我第二个@cadolphs建议在函数开始时强制转换类型,以避免以后需要强制转换,尽管建议使用
.into()
(或.try_into()
)而不是as
,如下所示:原因是
as
转换的行为通常不是在极端情况下所期望的行为。例如,如果
k
,则let n = k as usize
将给予错误的结果(一个i32
)恰好是负的,它会对值进行符号扩展,然后将其解释为正,从而产生一个巨大的n
。相反,.try_into()
会检查以确保k
可以正确转换为usize
,如果无法转换,则返回Err
。一般来说,默认情况下,您可能希望使用
.into()
(或.try_into()
)进行转换,除非您完全理解as
转换的行为(并且您实际上需要该行为)。