[ CodeWar ] - 002:最大和最小值

619 阅读2分钟

系列文章

题目

老规矩,先看题:

img-01

大致意思就是,返回输入的字符串中中的最大值和最小值。

这里还有一些提示:

  • 所有数值都是有效的 Int32,无需验证
  • 输入字符中至少存在一个数字
  • 输出的格式应该是:"max min"

解析

这道题的思路很简单:

  • Step1:将字符串转化成数组,再将数组中的元素转化成数值
  • Step2:将数组按从大到小排序
  • Step3:返回数组的首位和末尾

直接按照思路实现代码即可:

function highAndLow(numbers{
  const arr = numbers.split(" ").map(Number).sort((a, b) => a - b)
  return `${arr.pop()} ${arr[0]}`
}

乍一看好像没什么问题,但假如我们输入的值只有一个数值的时候会怎么样呢?

img-02

显然,是因为 pop 将值弹出去了,所以后面的 arr[0] 只能取到 undefined,这个时候有两种解决方案:

  • 先取 arr[0],后取 pop
  • pop 换成 arr[arr.length - 1]

另外,因为需求里输出格式为 max min,所以这里如果我们想按第一种方式来解决的话,应该更改排序的顺序:

function highAndLow(numbers{
  const arr = numbers.split(" ").map(Number).sort((a, b) => b - a)
  return `${arr[0]} ${arr.pop()}`
}

其他思路

我们来看看大佬有没有别的更加惊艳的实现思路呢?

function highAndLow(numbers){
  numbers = numbers.split(' ');
  return `${Math.max(...numbers)} ${Math.min(...numbers)}`;
}

利用了 Math 方法,可以不用遍历数组将其每个元素转化成数字,也不用对数组进行排序了。

function highAndLow(numbers){
  numbers = numbers.split(' ').map(Number);
  return Math.max.apply(0, numbers) + ' ' + Math.min.apply(0, numbers);
}

同样是利用了 Math 方法,看来这个方法很值得了解一下。