数组中出现次数超过一半的数字(Java实现)
2017-05-04 10:35
671 查看
本题为:剑指offer面试题29
牛客网测试地址:https://www.nowcoder.com/questionTerminal/e8a1b01a2df14cb2b228b30ee6a92163
时间限制:1秒 空间限制:32768K
算法知识视频讲解
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
Java代码如下:
package go.jacob.day504;
public class Demo1 {
/*
* 方法1:如果输入数组符合要求,那么所求数字的出现次数要多于其他所有数字次数之和
* 该方法不需要对输入数组进行操作
*/
public int MoreThanHalfNum_Solution(int[] array) {
if(array==null)
return 0;
int N=array.length;
int root=0;
int count=0;
for(int i=0;i<N;i++){
if(count==0){
root=array[i];
count=1;
}
if(array[i]==root){
count++;
}else{
count--;
}
}
//判断数组中书否存在出现次数大于一半的数字
if (checkArray(array, root)) {
return root;
} else
return 0;
}
/*
* 方法二:利用快速排序的partition方法找到处于N/2位置的元素,如果输入数组符合要求
* 那么该元素即为所求数字
* 该方法会对输入数组进行操作,面试时应该询问面试官能否允许。
*/
public int MoreThanHalfNum_Solution_1(int[] array) {
//判空
if (array == null)
return 0;
int N = array.length;
int middle = N / 2;
int index = partition(array, 0, N - 1);
while (index != middle) {
if (index > middle) {
index = partition(array, 0, index - 1);
} else
index = partition(array, index + 1, N - 1);
}
// 判断数组是否存在出现次数超过一般的数字
if (checkArray(array, array[index])) {
return array[index];
} else
return 0;
}
//快速排序中的partition方法
private int partition(in
c71f
t[] array, int left, int right) {
// 判断数组是否只有一个元素
if (left == right)
return left;
int root = array[left];
int i = left, j = right + 1;
while (true) {
while (array[++i] <= root) {
if (i == right)
break;
}
while (array[--j] >= root) {
if (j == left)
break;
}
if (i < j)
exch(array, i, j);
else
break;
}
exch(array, left, j);
return j;
}
//检查数组是否存在出现次数超过一半的数字
private boolean checkArray(int[] array, int root) {
int N = array.length;
int num = 0;
for (int i = 0; i < N; i++) {
if (array[i] == root) {
num++;
}
}
if (num * 2 > N)
return true;
else
return false;
}
private void exch(int[] array, int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
牛客网测试地址:https://www.nowcoder.com/questionTerminal/e8a1b01a2df14cb2b228b30ee6a92163
时间限制:1秒 空间限制:32768K
算法知识视频讲解
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
Java代码如下:
package go.jacob.day504;
public class Demo1 {
/*
* 方法1:如果输入数组符合要求,那么所求数字的出现次数要多于其他所有数字次数之和
* 该方法不需要对输入数组进行操作
*/
public int MoreThanHalfNum_Solution(int[] array) {
if(array==null)
return 0;
int N=array.length;
int root=0;
int count=0;
for(int i=0;i<N;i++){
if(count==0){
root=array[i];
count=1;
}
if(array[i]==root){
count++;
}else{
count--;
}
}
//判断数组中书否存在出现次数大于一半的数字
if (checkArray(array, root)) {
return root;
} else
return 0;
}
/*
* 方法二:利用快速排序的partition方法找到处于N/2位置的元素,如果输入数组符合要求
* 那么该元素即为所求数字
* 该方法会对输入数组进行操作,面试时应该询问面试官能否允许。
*/
public int MoreThanHalfNum_Solution_1(int[] array) {
//判空
if (array == null)
return 0;
int N = array.length;
int middle = N / 2;
int index = partition(array, 0, N - 1);
while (index != middle) {
if (index > middle) {
index = partition(array, 0, index - 1);
} else
index = partition(array, index + 1, N - 1);
}
// 判断数组是否存在出现次数超过一般的数字
if (checkArray(array, array[index])) {
return array[index];
} else
return 0;
}
//快速排序中的partition方法
private int partition(in
c71f
t[] array, int left, int right) {
// 判断数组是否只有一个元素
if (left == right)
return left;
int root = array[left];
int i = left, j = right + 1;
while (true) {
while (array[++i] <= root) {
if (i == right)
break;
}
while (array[--j] >= root) {
if (j == left)
break;
}
if (i < j)
exch(array, i, j);
else
break;
}
exch(array, left, j);
return j;
}
//检查数组是否存在出现次数超过一半的数字
private boolean checkArray(int[] array, int root) {
int N = array.length;
int num = 0;
for (int i = 0; i < N; i++) {
if (array[i] == root) {
num++;
}
}
if (num * 2 > N)
return true;
else
return false;
}
private void exch(int[] array, int i, int j) {
int tmp = array[i];
array[i] = array[j];
array[j] = tmp;
}
}
相关文章推荐
- java实现找出数组中出现次数超过一半的数字
- 数组中有一个数字出现的次数超过了数组长度的一半,请找出这个数。java实现
- 数据结构与算法分析笔记与总结(java实现)--数组4:数组中出现次数超过一半的数字
- 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)
- 基于Java代码实现数字在数组中出现次数超过一半
- 《剑指offer》编程题java实现(十):数组中出现次数超过一半的数字
- java实现:数组中出现次数超过一半的数字
- 剑指Offer面试题29:数组中出现次数超过一半的数字 Java实现
- java 找到数组中出现次数超过数组长度一半的那个数字
- 面试题29:找到数组中出现次数超过一半的数字(java)
- PHP实现找出数组中出现次数超过数组长度一半的数字算法示例
- php实现数组中出现次数超过一半的数字的统计方法
- JAVA: 数组中出现次数超过一半的数字
- 剑指offer第二十八题【数组中出现次数超过一半的数字】c++实现
- java之数组中出现次数超过一半的数字
- Java实现——求整数数组中出现次数超过数组长度一半的元素
- 剑指offer:数组中出现次数超过一半的数字(java)
- 数组中出现次数超过一半的数字(java版)
- Java实现 找出数组中出现次数超过数组长度一半的元素
- 找出数组中出现次数大于一半的数字 Java实现 剑指offer