VS Code与在线编辑器中相同函数返回结果不一致问题求助
问题排查与修复:提交后部分结果为NaN的原因
你的代码逻辑依赖于传入的数组第一个元素是数值范围(n),但网站的判题系统并没有把n作为数组的第一个元素传入——它直接将输入的n个整数组成纯元素数组传递给countingSort函数。
本地测试时,你传入的数组是[100, 63, 25, ...],arr.shift()拿到100后创建了长度为100的countArr(索引0-99),完全覆盖了所有元素的取值范围(最大元素是99),所以结果正常。但网站提交时,传入的数组是[63,25,73,...],此时arr.shift()拿到的是63,创建的countArr长度只有63(索引0-62)。当处理到大于62的元素(比如63、73、98等)时,countArr[arr[i]]是undefined,执行undefined +=1就会得到NaN,这就是你看到“前64个数值正确,后36个变为NaN”的原因——前63个索引(0-62)对应的值能正确计数,第64个开始是超过62的元素,直接导致NaN。
修复方案
修改代码,不再从数组中提取range,而是通过数组元素的最大值来确定计数数组的长度(确保覆盖所有可能的元素值),或者根据题目明确的取值范围初始化:
function countingSort(arr) { // 找到数组中的最大值,确定计数数组的长度 const max = Math.max(...arr); // 创建长度为max+1的计数数组,初始值全为0 const countArr = new Array(max + 1).fill(0); // 遍历统计每个元素出现次数 for (let num of arr) { countArr[num] += 1; } return countArr; }
如果题目明确元素的取值范围是0到99(比如输入示例的最大元素是99),也可以直接初始化长度为100的数组,但上面的写法更通用,能适配任意非负整数数组的统计需求。
你可以本地模拟网站的传入方式,直接传入纯元素数组[63,25,73,...]复现问题,验证修改后的代码能正常输出正确结果。
内容的提问来源于stack exchange,提问作者Natalie Smyth
相关产品推荐
相关产品推荐

