寻找发帖水王java_2.3 寻找发帖水王
2.3 尋找發(fā)帖水王
基礎(chǔ)問題
就是找到一個(gè)數(shù)組中超過一半的數(shù)字
解法:
vote 投票法
sort 排序法
import java.util.Arrays;
class Test{
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5,4,4,4,4,4,4};
System.out.println(mainNum(arr));
System.out.println(mainNum2(arr));
}
/**
基礎(chǔ)問題:就是找到一個(gè)數(shù)組中超過一半的數(shù)字,
*/
// 解法1 vote 投票法
public static int mainNum(int[] arr){
int vote = 0;
int res = 0;
for(int i = 0;i
// 如果當(dāng)前的票數(shù)為0,表示沒有候選人
if(vote == 0){
vote++;
res = arr[i];
}
// 如果有票數(shù)
else{
// 如果當(dāng)前元素就是候選人
if(arr[i] == res) vote++;
// 如果當(dāng)前元素不是候選人
else vote--;
}
}
return res;
}
// 解法2 sort 排序法
public static int mainNum2(int[] arr){
Arrays.sort(arr);
return arr[arr.length/2];
}
}
拓展問題 超級(jí)水王沒有了,統(tǒng)計(jì)結(jié)果表明有三個(gè)發(fā)帖很多的id,發(fā)帖的數(shù)目均超過了總數(shù)目的1/4 , 您讓快速的找到他們的id么?
解法:
當(dāng)然是hashmap了,用hashmap記錄,然后遍歷hashmap的value,看哪一個(gè)的value大于arr.length/4 ,記錄相應(yīng)的key即可
當(dāng)然還是使用投票法了 vote
import java.util.List;
import java.util.ArrayList;
import java.util.Map;
import java.util.HashMap;
class Test{
public static void main(String[] args) {
int[] arr2 = new int[]{1,1,2,2,2,3,3,3,4,4,4};
System.out.println(mainNums(arr2));
System.out.println(mainNums2(arr2));
}
/**
拓展問題:
超級(jí)水王沒有了,統(tǒng)計(jì)結(jié)果表明有三個(gè)發(fā)帖很多的id,發(fā)帖的數(shù)目均超過了總數(shù)目的1/4 , 您讓快速的找到他們的id么?
*/
// 解法1 當(dāng)然是hashmap了,用hashmap記錄,然后遍歷hashmap的value,看哪一個(gè)的value大于arr.length/4 ,記錄相應(yīng)的key即可
public static List mainNums(int[] arr){
Map record = new HashMap<>();
for(int num:arr){
if(!record.containsKey(num)) record.put(num,0);
record.put(num,record.get(num)+1);
}
List res = new ArrayList<>();
for(int key:record.keySet()) if(record.get(key) > arr.length/4) res.add(key);
return res;
}
// 解法2 當(dāng)然還是使用投票法了 vote
public static List mainNums2(int[] arr){
// 創(chuàng)建一個(gè)數(shù)組用于記錄票數(shù)
int[] votes = new int[3];
// 創(chuàng)建一個(gè)數(shù)組用于記錄結(jié)果
int[] res = new int[3];
for(int num:arr){
// flag 表示當(dāng)前的元素是否被利用
boolean flag = false;
// 如果當(dāng)前遍歷的元素已經(jīng)在res里面了
for(int i = 0;i<3;i++){
if(num == res[i]){
votes[i]++;
flag = true;
break;
}
}
// 如果當(dāng)前的元素不再res里面,votes中三個(gè)位置還有0,就將res這個(gè)位置用當(dāng)前遍歷的元素填充
for(int i =0;i<3;i++){
if(votes[i] == 0 && !flag){
votes[i]++;
res[i] = num;
flag = true;
break;
}
}
if(!flag){
if(num == arr[0]){
votes[0]++;
}
else if(num == arr[1]){
votes[1]++;
}
else if(num == arr[2]){
votes[2]++;
}
else for(int i =0;i<3;i++) votes[i]--;
}
}
List ans = new ArrayList<>();
for(int num:res) ans.add(num);
return ans;
}
}
總結(jié)
以上是生活随笔為你收集整理的寻找发帖水王java_2.3 寻找发帖水王的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 思维导图软件Mindmanager201
- 下一篇: 技术资源分享(更新中)