我准备写一系列关于编程的博客,旨在提高自己的编程能力。编程能力是一个程序员修养的重要体现,编程不仅可以提高自己的逻辑思维能力,而且可以提高处理问题的能力以及考虑问题的全面性。每篇一个题目,愿与君共勉。
题目描述:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
题目要求:时间限制:1秒 空间限制:32768K
解题思路:
- 首先,数组中有一个数字出现的次数超过数组长度的一半就暗示了一条很重要的信息,即如果该数存在,我们对数组进行排序,那么array[array.length/2]一定等于该数值。
- 如果排序你想出来了,那么接下来的问题就迎刃而解了。我们只需要定义一个计数器count来记录该值的个数。怎么记录?通过一个for循环就完全可以解决了。
- 最后,我们只需判断count是否大于(array.length/2)就可以了。
实现代码如下:
public class Test01 {
public int MoreThanHalfNum_Solution(int [] array) {
//判断数组的长度是否大于0
if(array.length<1){
return 0;
}
//对数组进行排序,如果对数组的操作不了解,请看我博客里面的数组详解
Arrays.sort(array);
//定义一个计数器,记录array[array.length/2]出现的次数
int count = 0;
//遍历数组中的元素
for (int i = 0; i < array.length; i++) {
//如果相等,count加一
if(array[i]==array[array.length/2]){
count++;
}
}
//判断该数字出现的次数是否超过长度的一半,没有则返回0
if(count<=array.length/2){
return 0;
}
//返回数组中数字出现次数超过长度一半的数值。
return array[array.length/2];
}
public static void main(String[] args) {
Test01 test = new Test01();
int[] array = {1,2,2,3,2,2,5,4,2};
int result = test.MoreThanHalfNum_Solution(array);
System.out.println(result);
}
}
运行结果如下:
2
总结
本题编程实现并不难,主要考虑到时间复杂度和空间复杂度,即该算法的效率,本题的时间复杂度为O(n)。对时间复杂度和空间复杂度不了解的可关注我的博客–数据结构与算法基本知识。在进行编程之前,切不可试探性编写,我们首先解决的是思路,然后才是coding的过程。