簡體   English   中英

當數組作為參數傳遞並且長度還不存在時,如何利用函數中的數組長度(在JavaScript中)?

[英]How do I utilize the length of an array in a function (in JavaScript) when the array is being passed as a parameter and the length does not exist yet?

我正在嘗試編寫一個函數,該函數將一個字符串數組( strarr )和一個整數( k )作為參數,並返回由數組中k個連續字符串組成的最長字符串,而不用逗號分隔。 我需要在函數執行過程中經常調用strarr.length ,但是我一直收到錯誤消息,說它無法讀取該參數的長度。

這是我第一次處理此問題,但是我沒有找到很好的Internet搜索結果來尋找解決方案。 我懷疑我缺少非常明顯的東西。 我嘗試將strarr數組參數的值推入新數組,但仍然沒有運氣。

因此,如果我有const = ['apple','pineapple','banana','strawberry']作為我的strarr參數傳遞,2作為k傳遞,則它應該返回'bananastrawberry'因為它是最長的連續字符串對在數組中。

 const arr = ['apple', 'pineapple', 'banana', 'strawberry'] function longestConsec(strarr, k) { if (strarr.length === 0) { return ""; } else if (k > strarr.length) { return ""; } else if (k <= 0) { return ""; } let longest = ""; let strLeng = 0; for (let i = 0; i < strarr.length; i++) { for (let j = i + (k - 1); j > 0; j--) { strLeng += strarr[j].length; } if (strLeng > longest.length) { longest = strarr.slice(i, (i + k)).join(""); } } return longest; } console.log(longestConsec(arr, 2)) 

如前所述,您正在嘗試訪問數組中不存在的索引。 快速修復方法可能是:

const arr = ['apple', 'pineapple', 'banana', 'strawberry']


function longestConsec(strarr, k) {
  if (strarr.length === 0) {
    return "";
  } else if (k > strarr.length) {
    return "";
  } else if (k <= 0) {
    return "";
  }
  let longest = "";
  let strLeng = 0;
  for (let i = 0; i < strarr.length; i++) {
    for (let j = i + (k - 1); j > 0; j--) {
        if (j >= strarr.length) {
            break;
        }
      strLeng += strarr[j].length;
    }
    if (strLeng > longest.length) {
      longest = strarr.slice(i, (i + k)).join("");
    }
  }
  return longest;
}
console.log(longestConsec(arr, 2))

但我建議您看看是否有比添加break語句更好的解決方案。

你犯的錯誤

在內部for循環中, for (let j = i + (k - 1); j > 0; j--) ,您從i + k - 1開始計數。 但是,如果i是數組的最后一個索引( strarr.length == 10並且i == 9 )並且k == 2怎么辦? 然后,循環從j = 9 + 2 - 1 = 10 strLeng += strarr[10].length j = 9 + 2 - 1 = 10並在下面一行,您嘗試執行strLeng += strarr[10].length ,但strarr[10]

在找到最長的字符串之前,似乎也不必創建字符串。 相反,您可以只記住最后一個最長字符串的開始索引。

如何做得更好

讓我們看一下需求。 對於數組中的每個i ,您要合並k個連續的字符串並保留最長的組合。 由此得出:

  • i + k - 1不得大於strarr.length 由於i是唯一的變量,因此我們需要通過循環到strarr.length - k + 1來限制它。
  • 如果k == strarr.length ,則只能創建一個字符串strarr.join("")

最后,有一個想法,您可能根本不需要嵌套循環。 對於每個i ,您只需減去當前窗口中最后一個字符串的長度,然后添加一個新字符串。 見圖片:

在此處輸入圖片說明

因此,考慮到這一點,我建議您編寫以下版本的代碼:

function longestConsec(strarr, k) {
  // Cannot create any joined string with k greater than length
  if(strarr.length < k) {
      return "";
  }
  else if(k <= 0) {
      return "";
  }
  else if(strarr.length == k) {
      return strarr.join("");
  }
  let longestIndex = -1;
  let longestLength = 0;
  // length of our current group of strings
  let currentLength = 0;

  const maxLen = strarr.length;

  for(let i=0; i<maxLen; ++i) {
      // Forget the first strings length
      if(i >= k) {
        currentLength -= strarr[i-k].length;
      }
      // add the current strings length
      currentLength += strarr[i].length;
      // check if this is the largest length and save it's index
      // Only possible after processing at least k strings
      // Eg when i==1, we already went through 2 strings at this point
      if(i >= k-1) {
        if(currentLength > longestLength) {
            const startIndex = i-k+1;
            longestLength = currentLength;
            longestIndex = startIndex;
        }
      }
  }
  return strarr.slice(longestIndex, (longestIndex + k)).join("");
}

這是一個jsFiddle測試: https ://jsfiddle.net/32g5oqd1/2/

暫無
暫無

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

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