我也統計一下字串中出現最多的字母與個數

CV程式設計師發表於2018-12-17

我在上一篇文章對JS遍歷資料的方法做了總結,現在趁著這個題目實戰一下。

方案一

最常規的思路:用變數儲存目標字母和個數,迴圈遍歷不斷更新結果。知識點:

  • new Set(arr) //Set去重,目標字串長的話去重還是有必要的
  • Array.filter() // 篩選得到符合條件的新陣列
const testStr = "aaaadddddssssgdhssssbbbbbuuuwmopqlsabcfwsqdghgukssuyutsudddddsasss" //其後方案均使用該測試資料

// 統計字串中出現最多的字母與個數
const getStrMax = str => {
  const arr = str.split("");//轉成陣列
  const arrSet = new Set(arr);//去重

  let maxCount = 0;//記錄最大數量
  let maxItem = [];//記錄最大數量的字母,考慮到有重複,用了陣列

  for (let value of arrSet.values()) {
    const count = arr.filter(item => {
      return item === value
    }).length;
    if (count > maxCount) {
      maxCount = count;
      maxItem = [value];
    } else if (count === maxCount) {
      maxItem.push(value);
    }
  }

  return {
    maxItem,
    maxCount
  }
}

console.log(getStrMax(testStr))//{ maxItem: [ 's' ], maxCount: 17 }
複製程式碼

方案二

思路:先獲取每個字母出現的個數,再取出個數最多的那個。知識點:

  • Array.map() //遍歷原陣列得到想要的新陣列
  • [...new Set(arr)] //擴充套件運算子,用於set結構轉陣列
  • Array.sort() //陣列排序
//獲取每個字母的數量
const getResult = str => {
  const arr = str.split("");//轉成陣列
  return [...new Set(arr)].map(value => {
    const count = arr.filter(item => {
      return item === value
    }).length
    return {
      value,
      count
    }
  })
}
//按count從大到小排序
const result = getResult(testStr).sort((a, b) => {
  return b.count - a.count
})
//第一個就是結果
console.log(result[0])
複製程式碼

方案三

思路:同方案二,只是應用reduce方法,減少了程式碼量。知識點:

  • Array.reduce() //遍歷陣列並累加指定的資料
  • Array.from() //類陣列物件轉陣列
  • Object.entries() //物件轉陣列
const getByReduce = str => {
  return Array.from(str).reduce((obj, v) => {
    const objVal = obj[v] || 0;
    objVal === 0 ? obj[v] = 1 : obj[v] = objVal + 1
    return obj;
  }, {});
}
//轉陣列然後排序
const arr = Object.entries(getByReduce(testStr)).sort((a, b) => {
  return b[1] - a[1]
})

console.log(arr[0]);//[ 's', 17 ]
複製程式碼

寫在最後

  • 吾愛吾碼,但更愛真理。如有不正確或脫了褲子放屁的操作敬請指出。溫柔些,臉皮薄……
  • 如有其他更好、炫酷抑或有趣的方案,歡迎評論留言。

相關文章