亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在無序整數數組中查找最大對和的函數

在無序整數數組中查找最大對和的函數

慕神8447489 2022-09-29 15:41:58
我想寫一個函數,給定一個無序數字序列,找到最大的對和。largestPairSum([10, 14, 2, 23, 19]) --> 42 (i.e. sum of 23 and 19)largestPairSum([99, 2, 2, 23, 19])  --> 122 (i.e. sum of 99 and 23)largestPairSum([-10,-20,-30,-40])   --> -30 (i.e sum of -10 and -20)我的嘗試function largestPairSum(numbers){   let counter =0;   let numbersord = numbers.sort();   if (numbersord[0] === -numbersord[0]) {       numbersord.reverse()       counter=numbersord[0]+numbersord[1]       }   else {       counter=numbersord[-1]+numbersord[-2]    }  return counter}當調用時,該函數說“NaN”,但是當我console.log(typeof(numbersord[0]))它說數字。不知道我哪里做錯了,感謝您的閱讀!
查看完整描述

4 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

你的方法不起作用,因為

  • 按字符串升序排序(標準無回調)

  • 使用負指數。

你可以按降序排序,并取前兩個埃勒姆特。

function largestPairSum(numbers) {

    numbers.sort((a, b) => b - a);


    return numbers[0] + numbers[1];

}


console.log(largestPairSum([10, 14, 2, 23, 19])); // 42 (23 + 19)

console.log(largestPairSum([99, 2, 2, 23, 19]));  // 122 (99 + 23)

console.log(largestPairSum([-10, -20, -30, -40])) // -30 (-10 + -20)


無需排序的解決方案。


function largestPairSum(numbers) {

    let largest = numbers.slice(0, 2),

        smallest = largest[0] < largest[1] ? 0 : 1;


    for (let i = 2; i < numbers.length; i++) {

        if (largest[smallest] > numbers[i]) continue;

        largest[smallest] = numbers[i];

        smallest = largest[0] < largest[1] ? 0 : 1;

    }

    return largest[0] + largest[1];

}


console.log(largestPairSum([10, 14, 2, 23, 19])); // 42 (23 + 19)

console.log(largestPairSum([99, 2, 2, 23, 19]));  // 122 (99 + 23)

console.log(largestPairSum([-10, -20, -30, -40])) // -30 (-10 + -20)


查看完整回答
反對 回復 2022-09-29
?
滄海一幻覺

TA貢獻1824條經驗 獲得超5個贊

在 中,如@VLAZ所建議:O(n)


const largestPairSum = (arr) => {

  let a = -Infinity,

      b = -Infinity;

  

  for (let item of arr)

    if (item > a && b > -Infinity)

      a = item;

    else if (item > b)

      b = item;

      

  return a+b;

}


let tests = [

  largestPairSum([10, 14, 2, 23, 19]),

  largestPairSum([99, 2, 2, 23, 19]),

  largestPairSum([-10,-20,-30,-40]),

];


console.log(tests);

console.log("Nina's test:", largestPairSum([20, 50, 10, 1, 2]));


查看完整回答
反對 回復 2022-09-29
?
蝴蝶不菲

TA貢獻1810條經驗 獲得超4個贊

代碼中存在三個問題。


首先,是不正確的。嘗試從數組中獲取負索引,只是返回 ,因為那里什么都沒有。它不是從最后翻轉和獲取,要做到這一點,你需要明確地傳遞從最后獲取內容:counter=numbersord[-1]+numbersord[-2]undefinedarrayLength - negativeIndex


const arr = ["a", "b", "c", "d", "e"];


console.log(arr[1]);

console.log(arr[2]);


console.log(arr[-1]);

console.log(arr[-2]);


console.log(arr[arr.length - 1]);

console.log(arr[arr.length - 2]);


第二,是不正確的。它使用詞典順序進行排序,而不是數字,其中還有 。您需要正確對數字進行排序(請查看鏈接以獲取更多信息):numbers.sort()1 < 210 < 2


const arr = [1, 2, 10, 20]


arr.sort();

console.log("default (lexicographical) sort", arr);


arr.sort((a, b) => a - b);

console.log("ascending sort", arr);


arr.sort((a, b) => b - a);

console.log("descending sort", arr);


最后,這種情況是無用的。唯一等于自身負數的數字是零:if(numbersord[0] === -numbersord[0])


console.log(0 === -0);

console.log(1 === -1);

console.log(42 === -42);

console.log(Infinity === -Infinity);

console.log(NaN === -NaN);


但是,檢查這沒有用。那里的邏輯(基本上)檢查數組是否以零開頭,如果是,它將反轉它并獲取前兩個結果。如果它不以零開頭,它將嘗試獲取數組的最后兩個元素。


但是,如果您只是按降序排序,則可以免費獲得所有這些內容,并且每次都可以獲取前兩個項目。


因此,通過這些更改,您的代碼如下所示


function largestPairSum(numbers)

{

   let counter =0;

   //perform a descending sort

   let numbersord = numbers.sort((a, b) => b - a);

   

   //always take the first two items

   counter=numbersord[0]+numbersord[1]

       

   return counter

}


console.log(largestPairSum([10, 14, 2, 23, 19]))// --> 42 (i.e. sum of 23 and 19)

console.log(largestPairSum([99, 2, 2, 23, 19])) // --> 122 (i.e. sum of 99 and 23)

console.log(largestPairSum([-10,-20,-30,-40]))  // --> -30 (i.e sum of -10 and -20)


查看完整回答
反對 回復 2022-09-29
?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

NaN類型是一個數字,它是正確的。您之所以得到這個消息,是因為任何數組中都沒有索引為“-1”或“-2”的元素。如果你想從最后得到一個元素,你必須使用類似的東西


arr[arr.length - 1] // returns last element

然后


let numbersord = numbers.sort(); // sort() method mutates the original array, be careful

numbersord[0] === -numbersord[0] // - returns true only when number is 0

// to check if it is negative use Math.abs()

問題是 - 數組可以同時包含負元素和正元素嗎?在這種情況下,您不能只是反轉數組 [-10, -5, -2, 10] - 最大和是 8,而不是 -15。


我會使用這樣的簡化方法:


function largestPairSum(arr) {

  const initialAcc = [-Infinity, -Infinity]

  const highestNumbers = arr.reduce((acc, rec)=> {

    if (rec <= acc[0]) return acc

    if (rec >= acc[1]) return [acc[1], rec]

    return [rec, acc[1]]

  },initialAcc)

  return highestNumbers[0] + highestNumbers[1]

}


查看完整回答
反對 回復 2022-09-29
  • 4 回答
  • 0 關注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號