求长度为k的最大平均子数组:Python代码返回值被向下取整的疑问
解决滑动窗口求最大子数组平均时的取整问题
我需要实现一个函数,找到长度为k的连续子数组的最大平均值并返回。用滑动窗口法写了如下代码:
def findMaxAverage(self, nums, k): """ :type nums: List[int] :type k: int :rtype: float """ curr = 0 # 获取第一个窗口的和 for i in range(k): curr+=nums[i] ans = curr # 滑动窗口寻找最大和 for i in range(k, len(nums)): curr+=nums[i]-nums[i-k] ans = max(curr, ans) # 返回最大和除以k得到最大平均值 return ans/k
但提交答案时发现,即使使用单除法运算符/,输出仍被向下取整。比如测试用例nums = [1,12,-5,-6,50,3],k = 4,预期结果为12.75,但实际输出为12.00。
问题原因
这是因为代码运行在Python2环境中:Python2里,两个整数使用/运算时会执行地板除法(向下取整),哪怕最终返回值声明为float类型,运算结果已经被截断成整数,再转float就成了12.0。
解决办法
有两种简单的修复方式:
- 显式将其中一个操作数转为浮点数,确保除法返回浮点结果:
或者return float(ans) / kreturn ans / float(k) - 在代码最顶部导入
division模块,强制Python2使用Python3的除法规则(/返回浮点数,//才是地板除法):from __future__ import division def findMaxAverage(self, nums, k): # 原有代码不变
验证测试用例
修改后,针对测试用例计算:最大子数组和是12 + (-5) + (-6) + 50 = 51,51/4 = 12.75,就能得到正确的浮点结果。
内容的提问来源于stack exchange,提问作者doublec
相关产品推荐
相关产品推荐

