【问题标题】:Replacement - Codewars Algorithm Challenge替换 - Codewars 算法挑战
【发布时间】:2023-12-07 15:44:01
【问题描述】:

This Codewars Challenge 要求您

从序列中只选择一个元素并将其替换为另一个大于 0 的整数。不允许将数字替换为自身,或者根本不更改任何数字。

我的思路是把输入数组从小到大排序,在前面加上1,然后从数组中去掉最大的元素。这应该会产生尽可能低的序列,因为我基本上是用 1 交换最大的元素。

例子:

([1,2,3,4,5]) => [1,1,2,3,4]

([4,2,1,3,5]) => [1,1,2,3,4]

([2,3,4,5,6]) => [1,2,3,4,5]

([2,2,2]) => [1,2,2]

([42]) => [1]

我试过了:

function replacement(a){
  let sorted = a.sort((a, b) => a - b);
  sorted.unshift(1);
  return sorted.slice(0, sorted.length -1);
}

console.log(replacement([2,3,4,5,6]));

这适用于上述测试,但似乎失败了 2 / 109。

wrong answer in test a=[1,1,1,1] - Expected: [1, 1, 2], instead got: [1, 1, 1]
wrong answer in test a=[1,1] - Expected: [2], instead got: [1]

我不明白为什么我的代码未能通过这些测试 - Codewars 没有显示失败测试的输入顺序。有任何想法吗?谢谢。

【问题讨论】:

  • 我认为如果max是1,你必须用2替换它。应该是它。
  • 谢谢!发布后才意识到这一点......

标签: javascript arrays algorithm sorting


【解决方案1】:

正如@vivek 指出的那样,我只是错过了检查最大值是否为1 的检查。如果是的话,我只需要替换成2就行了。

function replacement(a){
  let sorted = a.sort((a, b) => a - b);
  if (sorted[sorted.length - 1] === 1){
    sorted.pop();
    sorted.push(2);
    return sorted;
  }
  sorted.unshift(1);
  return sorted.slice(0, sorted.length -1);
}

console.log(replacement([1, 1, 1, 1]));

【讨论】: