iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 3
0
自我挑戰組

菜鳥工程師的奇幻漂流:跟著kata活化手指和意識系列 第 3

Get the mean of an array

今日kata

原始題目如下:(8kyu)
It's the academic year's end, fateful moment of your school report. The averages must be calculated. All the students come to you and entreat you to calculate their average for them. Easy ! You just need to write a script.
Return the average of the given array rounded down to its nearest integer.
The array will never be empty.

翻譯:
給一陣列,計算所有元素的平均值,(取最小整數)


構想&解法

function getAverage(marks){
 return Math.floor(marks.reduce((acc,cur)=>acc+cur,0)/marks.length)
}

使用array的reduce計算總和,計算平均後,使用Math.floor取得最小整數。
reduce真的好好用,回不去了/images/emoticon/emoticon15.gif


其他解法觀摩

const getAverage = marks => ~~(marks.reduce((s, v) => s + v) / marks.length);

~~=Math.floor的效果,~~ 比使用 Math.floor 的效能好,可以想成位元運算更接近底層的運作模式。


function getAverage(marks){
  var sum = 0;
  for(var i = 0;i<marks.length;i++){
    sum+=marks[i];
  }
  return Math.floor(sum/marks.length);
}

這個寫法雖然code會比較長,但覺得是最好理解的,也是剛入門時學習的寫法之一!


整理用法

位元運算子 (Bitwise operator)

摘自JavaScript Bitwise Operations

Opearator Name 說明
& AND 對應位元都為1,回傳1
| OR 對應位元其中有一個以上為1,回傳1
^ XOR 對應位元只有一個為1,回傳1
~ NOT 反轉運算元的位元 (1->0, 0->1)

運算式由運算子和運算元組成:

  • 要被運算的數值或是資料稱為運算元(operant)
  • 運算元之間的運算符號稱為運算子(operator)

範例:

1+5
// 1和5為運算元
// +為運算子

而位元運算子則是將運算元視作一組32位元0/1的數值,也就是將數值轉成二進位制再進行運算。

範例:

十進位  二進位
    9     1001
   15     1111
   
9&15
// 一個一個位置對,都為1才回傳1
// 1001

9|15
// 有一方包含1就回傳1
// 1111

9^15
// 僅有一方為1,才回傳1
// 0110

其中比較有趣的是~operator,它會將整數N轉換成-(N+1)

~2 === -3 // true
~1 === -2 // true
~-1 === 0 // true

~~最常用來取代Math.floor()

~~2 === Math.floor(2); // true, 2
~~2.5 === Math.floor(2); // true, 2

推薦閱讀Tilde or the Floor?

節錄文章總結:在追求更好的效能&簡化code的情況下,使用~~是ok的,但千萬不要為了用而用,畢竟這樣~~的寫法不是這麼容易理解。

以上為今日分享的內容,若有錯誤或是建議,請再隨時和我聯繫。


上一篇
Vowel Count
下一篇
Smallest unused ID
系列文
菜鳥工程師的奇幻漂流:跟著kata活化手指和意識30

尚未有邦友留言

立即登入留言