贪心算法求解最大薪资问题:提交代码未通过测试用例求错因
问题分析
你的代码核心问题出在排序规则设计错误,补末尾字符对齐位数的逻辑无法覆盖所有测试场景,会出现判断失误。
错误场景举例
输入数组[21, 211]:
- 按照你的逻辑,最大位数是3,21补末尾的1得到211,和211数值相等,代码会按照原有数组顺序排列两者
- 实际正确拼接结果应为
21211(21拼接211),而非21121(211拼接21),你的规则无法区分这种场景。
另外代码还有语法隐患:finalArr没有声明直接赋值,会隐式创建全局变量,严格模式下会直接报错。
修正方案
正确的排序规则不需要对齐位数,直接比较两个数字转字符串后拼接的结果即可:对于字符串a和b,如果a + b的字典序大于b + a,则a排在b前面。
修正后代码
function MaxSallary(nums) { // 全部转成字符串方便拼接比较 const strArr = nums.map(num => num.toString()); // 自定义排序规则 strArr.sort((a, b) => { const ab = a + b; const ba = b + a; // 降序排列,更大的拼接结果对应的字符串放前面 return ba.localeCompare(ab); }); // 处理全0的特殊情况:比如输入[0,0],输出应为0而非00 return strArr[0] === '0' ? '0' : strArr.join(''); }
边界场景说明
修正后的代码额外处理了全0的特殊输入,符合绝大多数判题系统的输出要求,同时所有原有测试用例均可正常通过。
内容的提问来源于stack exchange,提问作者Cihat Şaman
相关产品推荐
相关产品推荐

