使用docker搭建lnmp環境
阿新 • • 發佈:2020-10-13
陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為 9 的陣列 {1,2,3,2,2,2,5,4,2},由於數字 2 在陣列中出現了 5 次,超過陣列長度的一半,因此輸出 2。如果不存在則輸出 0
解法一
對陣列排序,如果符合條件的數存在,則一定是陣列中間那個數。程式碼就不寫了。
解法二
利用 Map 存值,找出存在最多的數字,若大於長度的一半,返回此數,否則返回 0
import java.util.Map; import java.util.HashMap; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { if(array == null || array.length == 0) { return 0; } Map<Integer, Integer> map = new HashMap<>(); for(int i = 0; i < array.length; i++) { if(map.containsKey(array[i])) { map.put(array[i], map.get(array[i]) + 1); } else { map.put(array[i], 1); } } for(Map.Entry<Integer, Integer> entry : map.entrySet()) { if(entry.getValue() > (array.length / 2)) { return entry.getKey(); } } return 0; } }
解法三
注意到目標數超過陣列長度的一半,如果對陣列同時去掉兩個不同的數字,到最後剩下的數就是該數字。實現的方式採用陣地攻守思想:
- 第一個數字作為第一個士兵,守陣地,count = 1
- 遇到相同元素,count++
- 遇到不相同元素,即為敵人,同歸於盡,count--
- 遇到 count = 0 的情況,又以新的 i 值作為守陣地的士兵,繼續下去,到最後還留在陣地上的士兵,有可能是我們希望的元素
- 再加一次迴圈,記錄這個士兵的個數看是否大於陣列一半即可
public class Solution { public int MoreThanHalfNum_Solution(int [] array) { if(array == null || array.length == 0) { return 0; } int val = array[0]; int count = 1; for(int i = 1; i < array.length; i++) { if(count == 0) { val = array[i]; count = 1; } else if(val == array[i]) { count++; } else { count--; } } count = 0; for(int i = 0; i < array.length; i++) { if(val == array[i]) { count++; } } return (count > array.length / 2) ? val : 0; } }