1. 程式人生 > >程式設計練習:尋找發帖"水王"

程式設計練習:尋找發帖"水王"

題目: 尋找發帖"水王"

  • 來源: 程式設計之美

    分析

  • 衍生:就是給定一個數組,其中某個元素出現次數超過了陣列長度的一半,找出這個元素

    方法s

    方法1

    對這個串進行遍歷,同時對出現的元素進行計數,可以用map,最後遍歷map取出計數值最大的那個元素

    方法2

    可以對陣列進行排序,第N/2個元素就是所求,下表從0開始

    方法3

    上面兩個方法都有排序操作,時間複雜度不可觀。

    可以一次遍歷, 在遍歷過程中刪除兩個不同的元素(不管是不是出現次數最多的那個元素),最後剩下的就是所求。

    實現

/**
 * @ClassName: Demo1
 * @Author: fanjiajia
 * @Date: 2018/12/19 下午8:35
 * @Version: 1.0
 * @Description: 某個字串陣列中存在出現次數超過該陣列長度一半的某一個串,找出來
 */
public class Demo1 {

    public static void main(String[] args) {
        String strs[] = {"a","3", "a", "d","a", "4","6","a", "a"};
        System.out.println(func1(strs));
    }
    

    /**
     * @Author fanjiajia
     * @Date 下午9:03 2018/12/19
     * @Description
     **/
    public static String func1(String[] strs) {
        /*
            方法一: 遍歷一次,對每一個串出現的次數進行累計
            方法二: 按照出現的次數進行排序,第N/2個必然是這個串,下標從0開始
            方法三: 上面的方法都會出現排序,時間複雜度高,可以一次遍歷,直接獲取
                    每一次刪除其中兩個不同的串,那麼最後剩下的必然是我們所需要的
         */
        String candidate = "";  // 儲存可能是那個串
        int nTimes, i;  // nTimes操作邏輯:與之不匹配消除一對id時減少1,否則加1
        for (i = nTimes = 0; i < strs.length; i++) {
            if (nTimes == 0) {  // ==0 說明遍歷過程前面的都已經配對消除了
                candidate = strs[i];
                nTimes = 1;
            }else { // 說明前面有某個串沒有完全配對消除
                if (strs[i] == candidate)    // 當前串和那個串相同,則計數值+1,否則用當前這個不同的串進行消除
                    nTimes ++;
                else
                    nTimes --;
            }
        }
       return candidate;
    }
}
  • 這裡陣列的元素型別時字串型別!!!

    衍生問題

  • 陣列中存在3個元素,切出現次數超過了陣列長度的1/4,求這三個元素

生命不息,使勁造