Fe-interview: [js] 第54天 写一个函数找出给定数组中的最大差值

Created on 8 Jun 2019  ·  16Comments  ·  Source: haizlin/fe-interview

第54天 写一个函数找出给定数组中的最大差值

js

Most helpful comment

function difference(arr) {
return Math.max(...arr) - Math.min(...arr)
}

var arr = [1,2,3,4,5,6]
console.log( difference(arr) )

All 16 comments

function getMax(arr){
for(let i=arr[arr.length-1];i>0;i--){
for(let j=0;j if(arr[j]>arr[j+1]){
let temp;
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
return arr.pop()-arr.shift();
}

console.log(getMax([2,3,7,20]))

先排序再减

function maxStep (arr) {
      return Math.max.applay(null, arr) - Math.min.apply(null, arr);
}
  function minMaxCalc(arr){
    const max = arr.reduce((a,b)=>{
      return a-b>0?a:b
    })
    const min = arr.reduce((a,b)=>{
      return a-b<0?a:b
    })
    return max-min
  }

function difference(arr) {
return Math.max(...arr) - Math.min(...arr)
}

var arr = [1,2,3,4,5,6]
console.log( difference(arr) )

第一反应先排序,然后尾减头。看了上面 Math.maxMath.min 的操作被惊艳到了。佩服佩服!

const getMaxDiff = arr => {
  const sortedArr = arr.sort((a, b) => a - b);
  return sortedArr[sortedArr.length - 1] - sortedArr[0];
};

console.log(getMaxDiff([1, 2, 3, 4, 5]));
console.log(getMaxDiff([7, 8, 3, 2, 0, 9, 12]));
console.log(getMaxDiff([100, 2, 3, 6, 101, 33, 76]));
console.log(getMaxDiff([1, 2, 2, 2, 2, 2, 2, 2, 2]))

按着标准的思路解题

const getMaxDiff = (arr = []) => {
  // 认为参数必是数组, 不做校验了~
  let max = 0
  while (arr.length) {
     let mins = arr.shift()
     for (let i = 0; i < arr.length; i++) {
       let temp = Math.abs(mins - arr[i])
       if (temp > max) {
         max = temp
       }
     }
  }
  return max
}

第一反应先排序,然后尾减头。看了上面 Math.maxMath.min 的操作被惊艳到了。佩服佩服!

const getMaxDiff = arr => {
  const sortedArr = arr.sort((a, b) => a - b);
  return sortedArr[sortedArr.length - 1] - sortedArr[0];
};

console.log(getMaxDiff([1, 2, 3, 4, 5]));
console.log(getMaxDiff([7, 8, 3, 2, 0, 9, 12]));
console.log(getMaxDiff([100, 2, 3, 6, 101, 33, 76]));
console.log(getMaxDiff([1, 2, 2, 2, 2, 2, 2, 2, 2]))

Math.max 和 Math.min 操作,岂不是至少需要两次遍历么,所以性能上应该不太好。

function getMaxDiff(arr) {
  let minNum = Math.min(...arr);
  let maxNum = Math.max(...arr);

  return maxNum - minNum;
}
console.log(getMaxDiff([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]));

个人认为用Math.min 和Math.max的时间复杂度是n 但是sort排序的时间复杂度是nlog(n)

Array.prototype.max = function() {
    return Math.max(...this);
}
Array.prototype.min = function() {
    return Math.min(...this);
}
[1,2,3].max() - [1,2,3].min() // 2

function getDiff(arr){
let max = arr[0]
let min = arr[0]
let len = arr.length
for(let i = 1; i if(max < arr[i]){
max = arr[i]
}
if(min > arr[1]){
min = arr[i]
}
}
return max - min
}

这道题就出到点子上了,最大插值,意味着要求出最大值和最小值,同时求出最大值和最小值应该是最优解,我在第29天的那个练习上已经说明了, #104

我又来了 还是考虑数组多维的情况利用Array.prototype.flat(Infinity)完全展开数组

function maxDiff(nums) {
  let newNums = nums.flat(Infinity).sort((a, b) => a - b)
  return newNums[newNums.length - 1] - newNums[0]
}

看到有大佬说个人认为用Math.min 和Math.max的时间复杂度是n 但是sort排序的时间复杂度是nlog(n) 那我们简单修改一下就好了

function maxDiff(nums) {
  let newNums = nums.flat(Infinity)
  return Math.max(...newNums) - Math.min(...newNums)
}

function difference(arr) {
return Math.max(...arr) - Math.min(...arr)
}

var arr = [1,2,3,4,5,6]
console.log( difference(arr) )

const getMaxDiff = (arr = []) => {
arr.sort((a, b) => a - b)
return arr.pop() - arr.shift()
}

Was this page helpful?
0 / 5 - 0 ratings