java toHalf_MoreThanHalfInArray.java
package pointer_to_offer;
import java.util.Random;
/**
* 面試題29:查找數組中出現次數超過一半的數字
* 1. 使用快速排序中的partition方法 和 遞歸
* 2. 根據題目邏輯,將出現的次數和結果保存起來,由于目標出現次數超過數組的一半,所以遍歷結束后結果就是目標
*/
public class MoreThanHalfInArray {
private static Random rand = new Random(47);
public static int findByPartition(int[] data) {
if (data == null) return -1;
int length = data.length;
int middle = length >> 1;
int start = 0;
int end = length - 1;
int index = partition(data, start, end);
while (index != middle) {
if (index > middle) {
end = index - 1;
} else {
start = index + 1;
}
index = partition(data, start, end);
}
int result = data[middle];
//有必要的話再檢查一下,這個數字是否真的占據了一半以上(針對非法的輸入)
return result;
}
private static int partition(int[] data, int start, int end) {
int index = start + rand.nextInt(end - start);
swap(data, end, index);
int smallPos = start - 1;
for (index = start; index < end; index++) {
if (data[index] < data[end]) {
smallPos++;
swap(data, index, smallPos);
}
}
smallPos++;
swap(data, end, smallPos);
return smallPos;
}
private static void swap(int[] data, int pos1, int pos2) {
if (pos1 == pos2) return;
int temp = data[pos1];
data[pos1] = data[pos2];
data[pos2] = temp;
}
private static int findByLogic(int[] data) {
if (data == null) return -1;
int result = data[0];
int times = 1;
for (int i = 0; i < data.length; i++) {
if (times == 0) {
result = data[i];
times = 1;
} else {
if (result == data[i]) {
times++;
} else {
times--;
}
}
}
return result;
}
public static void main(String[] args) {
int[] data = {1, 2, 3, 4, 1, 1, 1, 1, 1, 1, 3, 5, 1};
System.out.println(findByPartition(data));
System.out.println(findByLogic(data));
}
}
一鍵復制
編輯
Web IDE
原始數據
按行查看
歷史
總結
以上是生活随笔為你收集整理的java toHalf_MoreThanHalfInArray.java的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java.util 常见_Java基础知
- 下一篇: java密钥库文件存在但为空_java安