簡體   English   中英

Max/Min/Avg 按順序返回數組

[英]Max/Min/Avg returning array in that order

誰能告訴我我做錯了什么? 我打印數組的順序不正確。 我怎么稱呼它不同? 順便說一句,這是javascript。

給定一個數組 x(例如 [1,5, 10, -2]),創建一個算法(指令集)返回一個包含最大值、最小值和平均值的數組 ([max, min, avg]。ex [ 0,2,4] 應該返回 [4,0,2])。

我的代碼:

function maxMinAvg(arr) {
    var newarr= [];
    var max = arr[0];
    var min = arr[0];
    sum = sum + arr[0];
    var avg = sum/arr.length;
    for (var i = 1; i < arr.length; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
        if (arr[i] < min) {
            min = arr[i];
        }
        sum = sum + arr[i];
    }
    newarr.push([max[i],min[i],avg[i]]);
}

return newarr;

該功能應如下所示

function maxMinAvg(arr) {
    var max = arr[0];
    var min = arr[0];
    var sum = arr[0]; //changed from original post
    for (var i = 1; i < arr.length; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
        if (arr[i] < min) {
            min = arr[i];
        }
        sum = sum + arr[i];
    }
    return [max, min, sum/arr.length]; //changed from original post
}

嘗試這個...

function maxMinAvg(arr) {
  var max = arr[0];
  var min = arr[0];
  var sum = 0 ;
 arr.forEach(function(value){
     if(value > max)
       max = value;
     if(value < min)
       min = value;
     sum +=value;
 })
 var avg = sum/arr.length;
return [max,min,avg];

}

你已經有了min,max和avg的值(你有總和所以你可以計算它)。 只需創建一個新數組(不是原始的arr),將這些值(min,max和avg)添加到它並返回它。

您的代碼沒有以錯誤的順序返回值,它返回原始數組而不是具有max,min和average的數組。

看起來這些項目屬於wron g順序的原因是您選擇的測試數據恰好與您期望的結果相似。 如果您選擇輸入與輸出不相似的數據,例如[1,2,3,4,100] ,您會看到返回相同的數組。

只需使用值創建一個新數組並將其返回:

return [ max, min, avg ];

編輯:

使用您發布的新代碼,我發現了一些問題:

  • 它在計算所有項目總和之前的平均值。 它只是使用第一項。
  • 它不會初始化sum變量,因此它將包含undefined 添加到它時,結果將繼續undefined
  • sum變量不是本地變量,因此可能會干擾其他代碼。
  • 它正在將數組推入數組中,因此您將得到一個或多個數組而不是數組。
  • 它使用minmaxavg變量,就好像它們是數組時將它們放入結果中一樣。

解決這個問題,你得到:

function maxMinAvg(arr) {
    var max = arr[0];
    var min = arr[0];
    var sum = arr[0];
    for (var i = 1; i < arr.length; i++) {
        if (arr[i] > max) {
            max = arr[i];
        }
        if (arr[i] < min) {
            min = arr[i];
        }
        sum = sum + arr[i];
    }
    var avg = sum / arr.length;
    return [max, min, avg];
}

不確定這是否有效但你可以使用arr.sort()函數對它進行排序,你有你的最小值和最大值,然后只需添加所有值並找到均值。

function maxMinMean(arr){
    arr.sort();
    var sum = 0;
    for(var i=0, i<arr.length, i++){
        sum = sum + +arr[i];
    };
    return [+arr[length-1], +arr[0], sum/arr.length];
};

這假設您正在嘗試使用數組(如果數組中的數字存儲為字符串,它也可以工作)沒有測試它但應該正常工作。

function maxMinMean(arr: number[]) {
  if (!arr.length) return [NaN,NaN,NaN];
  arr.sort((a,b)=>a-b);
  return [
    arr.slice(-1)[0],
    arr[0],
    arr.reduce((sum, x) => sum + x,0) / arr.length,
  ];
}

如果您不想修改原始數組

function maxMinMean(arrIn: number[]) {
  if (!arrIn.length) return [NaN,NaN,NaN];
  var arr =[...arrIn].sort((a,b)=>a-b);
  return [
    arr.slice(-1)[0],
    arr[0],
    arr.reduce((sum, x) => sum + x,0) / arr.length,
  ];
}

如果你想要定點字符串

function maxMinMean(arr: number[]) {
  if (!arr.length) return [NaN,NaN,NaN];
  arr.sort((a,b)=>a-b);
  return [
    arr.slice(-1)[0],
    arr[0],
    arr.reduce((sum, x) => sum + x,0) / arr.length,
  ].map(f=>f.toFixed(2));
}

一個更優雅的解決方案,通過圖書館:

import {map, pipe} from 'iter-ops';
import {numberStats} from './extras';

const input = [1, 5, 10, -2];

const i = pipe(input, numberStats(), map(a => [a.max, a.min, a.avg]));

console.log(...i); //=> [ 10, -2, 3.5 ]

上述解決方案基於iter-ops庫,加上來自extras的自定義numberStats運算符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM