找出陣列中元素出現次數超過陣列長度一半的元素

一李發表於2020-12-26

題目:陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。

這道題有多種解法,下面主要說兩種。

  1. 常規方法:建立一個Map,遍歷陣列中的元素,如果元素不在map中出現過,將元素設定為key,value=1,如果元素在map中,就取出這個元素,並將對應的value值+1.最後遍歷map中的元素,如果有value>陣列長度的一半,就返回值
  2. 思維方法:先對陣列進行排序,如果有一個元素出現的次數超過了陣列長度的一半,那麼這個元素肯定是排序過後陣列的中間值。取出中間值和原來的陣列對比,如果相同count+1,最後判斷count大小是否大於一半。
function Solution(arr) {
      var m = new Map()
      arr.forEach(x => {
        if(m.get(x)){
          let num = m.get(x)+1
          m.set(x,num)
        }else{
          m.set(x,1)
        }
      });
      let mid = Math.floor(arr.length/2)
      for(let [key,value] of m){
        if(value>mid){
          return key
        }
      }
       return 0
    }
function Solution(arr) {
      let sortArr = arr.sort()
      let count = 0;
      let midNum = sortArr[Math.floor(sortArr.length/2)]
      for(let i = 0;i<arr.length;i++){
        if(arr[i]===midNum){
          count++
        }
      }
      return count > Math.floor(sortArr.length/2) ?  midNum : 0
    }

 

相關文章