程式設計練習:尋找發帖"水王"
阿新 • • 發佈:2018-12-19
題目: 尋找發帖"水王"
來源: 程式設計之美
分析
衍生:就是給定一個數組,其中某個元素出現次數超過了陣列長度的一半,找出這個元素
方法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,求這三個元素
生命不息,使勁造