我一直在努力弄清楚我做錯了什么。在 HackerRank 問題中,Mini-Max Sum 的問題是找到 5 個數字陣列的一部分之和。在他們給你的例子中,他們向你展示arr = [1,2,3,4,5]了最小的總和是1 2 3 4 = 10,最大的總和是2 3 4 5 = 14
我還是個新手,所以解決問題有時對我來說仍然是一個挑戰。我想出了這個作為我的第一個解決方案:
function minMax(arr){
console.log(arr, 'this is our arr')
var baseSum = 0
var minSum = 0
var maxSum = 0
var i = null
for(i=1;i<4;i ){
baseSum = arr[i]
}
console.log(baseSum, 'this is baseSum')
console.log(minSum = baseSum arr[0], maxSum = baseSum arr[4])
}
const numArr = [7, 69, 2, 221, 8974]
minMax(numArr)
我的想法是我可以獲取兩個變數之間一致的數字,獲取陣列的第一個和最后一個數字并將它們相加以獲得結果。它通過了一項測驗,但在 列出的值上失敗了numArr,如果我將最后 4 個數字相加,我得到 9266 但預期值為9271。
我花了一些時間試圖想出一種重構它的方法,我知道一開始不是很好,但我正在嘗試!
我想出了這個 -
function minMax(arr){
if (arr.length > 5){
return "Too long"
}
var minArr = arr.slice(0,4)
var maxArr = arr.slice(1,5)
minSum = 0
maxSum = 0
for (i=0; i < minArr.length;i ){
minSum = minArr[i]
}
for (x=0; x < maxArr.length; x ){
maxSum = maxArr[x]
}
console.log(minSum, maxSum)
}
但它回傳了與之前完全相同的東西。所以我要么不理解這個問題(可能發生了什么),要么總和在他們的預期值中是錯誤的。我什至拿了一個計算器,結果是 9266,所以我不明白我做錯了什么。
有沒有人遇到過這個問題,他們知道發生了什么嗎?
更新
我自己并不驚訝,我讀錯了問題。您應該在獲得總和之前對實際陣列進行排序。他們并沒有真正在問題中說明,所以它的措辭很糟糕,我大聲笑,但這最終是我為獲得正確價值所做的一切,以防萬一有人想知道。
if (arr.length > 5){
return "Too long"
}
arr.sort(function(a, b) {
return a - b;
});
var minArr = arr.slice(0,4)
var maxArr = arr.slice(1,5)
var minSum = 0
var maxSum = 0
var i = null
for (i=0;i<minArr.length;i ){
minSum = minArr[i]
}
for (i=0;i<maxArr.length;i ){
maxSum = maxArr[i]
}
console.log(minSum, maxSum)
}
const numArr = [7, 69, 2, 221, 8974]
minMax(numArr)
This obviously sums up different values so you'll get the correct answer!
uj5u.com熱心網友回復:
在問題中,未指定是否對輸入陣列進行排序,因此您唯一缺少的是按降序對陣列進行排序。
1)您可以sort先按ascending順序排列陣列
const clone = [...arr].sort((a, b) => a - b);
2)取first four sum。
const minSum = arr.slice(0, 4).reduce(sum, 0);
3)也采取last four sum
const maxSum = arr.slice(1).reduce(sum, 0);
function minMax(arr) {
const clone = [...arr].sort((a, b) => a - b);
const sum = (acc, curr) => acc curr;
const minSum = clone.slice(0, 4).reduce(sum, 0);
const maxSum = clone.slice(1).reduce(sum, 0);
console.log(minSum, maxSum);
}
const numArr = [7, 69, 2, 221, 8974];
minMax(numArr);
uj5u.com熱心網友回復:
繼續以半最小最大為導向。我建議將排序作為一個單獨的步驟。然后你可以在陣列中有兩個指標同時在陣列中移動以計算最小值和最大值:
function rank(arr, low, high) {
if (arr.length > 5) {
console.log("Too long");
return;
}
// we reached the fourth value, so we stop
if (high == 1)
return [arr[low], arr[high]];
// continue calculating at further depth
let minMaxRecur = rank(arr, low 1, high - 1);
return [arr[low] minMaxRecur[0], arr[high] minMaxRecur[1]];
}
let initialArray = [7, 69, 2, 221, 8974];
initialArray.sort((a, b) => a - b); // sort first
console.log(rank(initialArray, 0, 4));
這使用遞回演算法來計算陣列,但這當然可以通過一個遍歷陣列的單個回圈來簡單得多,例如:
function rankLoop(arr) {
let min = 0, max = 0;
for (let i = 0; i < 4; i ) {
min = arr[i];
max = arr[4 - i];
}
return [min, max];
}
console.log(rankLoop([2, 7, 69, 221, 8974], 0, 4));
這再次假設傳入的陣列已排序,這可以在我的第一個代碼片段中看到。其中任何一個都具有相同的時間復雜度。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/368768.html
標籤:javascript arrays
