簡體   English   中英

如何提高函數的性能和可讀性?

[英]How can I improve the performance and the readability of my function?

我最近不得不為求職面試做一個測試,提示是編寫一個函數,在給定一組負數和正數的情況下,該函數返回最接近 0 的數字。

我的函數運行正常,但我從招聘人員那里聽到說我的函數性能不是很好,可讀性也不是很好,他們提到了以下問題:

  • 性能 à 雙重檢查(過濾器 + 排序 + for + 推送 + 保留 + 移位,對 Math.abs 的 4 次相同調用)
  • 缺乏可讀性(4 if / else if)

我想知道如何改進我的函數以使其更具性能和可讀性?

這是我的功能:

const closestToZero = (arr) => {
  // 1-a variables:
  let positiveNumbers = [];
  let negativeNumbers = [];

  // 1-b returns 0 if the input is either undefined or an empty array
  if(typeof(arr) === 'undefined' || arr.length === 0) {
    return 0
  }

  // 2- filter out non-number values then sort the array
  const onlyNumbers = arr.filter(item => typeof(item) === 'number').sort((a,b) => a-b);

  // 3- split the numbers into positive numbers and negative numbers
  for(let i = 0; i < onlyNumbers.length; i++) {
    if(onlyNumbers[i] > 0) {
      positiveNumbers.push(onlyNumbers[i])
    } else if (onlyNumbers[i] < 0) {
      negativeNumbers.push(onlyNumbers[i])
    }
  }

  // 4- reverse the negative array to get the closest to 0 at the first index
  let reversedNegativeArray = negativeNumbers.reverse()

  // 5- get rid of all the other values and keep only the closest to 0, if array empty return 0
  let closestPositiveNumber = positiveNumbers.length > 0 ? positiveNumbers.shift() : 0
  let closestNegativeNumber = reversedNegativeArray.length > 0 ? reversedNegativeArray.shift() : 0

  // 6- Compare the result of the substraction of the closestPositiveNumber and the closestNegativeNumber to find the closestToZero
  if(closestPositiveNumber - Math.abs(closestNegativeNumber) > 0 && closestNegativeNumber === 0 ) {
    return closestPositiveNumber
  } else if (closestPositiveNumber - Math.abs(closestNegativeNumber) < 0 && closestPositiveNumber === 0) {
    return closestNegativeNumber
  } else if(closestPositiveNumber - Math.abs(closestNegativeNumber) > 0) {
    return closestNegativeNumber
  } else if (closestPositiveNumber - Math.abs(closestNegativeNumber) <= 0) {
    return closestPositiveNumber
  }
}

要求:

  • 如果輸入中最接近的數字可以是負數或正數,則函數返回正數
  • 如果輸入數組未定義或為空,則函數返回 0

當輸入為 [8, 5, 10] 時,函數返回 5

當輸入為 [5, 4, -9, 6, -10, -1, 8] 時,函數返回 -1

當輸入為 [8, 2, 3, -2] 時,函數返回 2

盡管這不是提供“答案”的最佳 StackExchange 論壇,但 Andreas 確實給出了答案。 一個解決方案可能是這樣的:(偽代碼)

winner = 0      # arbitrarily assume the zeroth element is closest
for (i from 1 to array-length):
   if abs(array[i]) < abs(array[winner]):    # this one's closer ...
      winner = i

abs() (絕對值)函數當然是“數字與零的接近程度”的指標。 abs(-3) == 3等等。

你的函數確實很復雜。 您可以充分利用這里的Math.abs函數來清理很多東西。 這是我會給出的 js 實現

test = [-1, 5, 4, -9, 6, -10, -1, 8, 1]; 


function closeToZero(arr){

    if(typeof(arr) === 'undefined' || arr.length === 0) {
        return 0;
    }

    ret = test[0]; 

    for(i = 1; i < test.length; i++){
        if(Math.abs(ret) >= Math.abs(test[i]) ){
            if(Math.abs(ret) == Math.abs(test[i])){
               ret = Math.max(ret, test[i]);
            }else{
                ret = test[i];
            }
        }
    }
    return ret; 

}

print(closeToZero(test));

如果需要,您還可以選擇檢查錯誤輸入

有可能招聘人員會找到一個使用reduce的解決方案也無法閱讀。

但要擴展安德烈亞斯的評論。

這是一個示例代碼片段,其中包含一個使用 reduce 的函數,用於比較絕對值或符號。

 const closestToZero = (arr) => { if(!arr || arr.length === 0) return 0; return arr.reduce((acc, x) => (Math.abs(x) < Math.abs(acc) || (Math.abs(x) === Math.abs(acc) && x > acc)) ? x : acc); } console.log(closestToZero()); console.log(closestToZero([])); console.log(closestToZero([8,5,10])); console.log(closestToZero([5, 4, -9, 6, -10, -1, 8])); console.log(closestToZero([8, -2, 3, 2]));

暫無
暫無

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

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