P163、面试题29:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
package com.yyq;
/**
* Created by gao on 15-10-23.
*/
public class MoreThanHalfNumber {
public static boolean g_bInputInvalid = false;
public static boolean checkInvalidArray(int[] numbers, int length) {
g_bInputInvalid = false;
if (numbers == null || length <= 0) {
System.out.printf("Numbers is null! Invalid Parameters.");
g_bInputInvalid = true;
}
return g_bInputInvalid;
}
public static boolean checkMoreThanHalf(int[] numbers, int length, int number) {
int times = 0;
for (int i = 0; i < length; i++) {
if (number == numbers[i])
times++;
}
boolean isMoreThanHalf = true;
if (times * 2 <= length) {
System.out.println("the number you find is not more than half.");
isMoreThanHalf = false;
g_bInputInvalid = true;
}
return isMoreThanHalf;
}
public static int Partition(int[] numbers, int length, int start, int end) {
if (numbers == null || length <= 0 || start < 0 || end >= length) {
System.out.printf("Invalid Parameters!");
return -1;
}
int index = numbers[start];
while (start < end) {
while (start < end && numbers[end] >= index) end--;
numbers[start] = numbers[end];
while (start < end && numbers[start] <= index) start++;
numbers[end] = numbers[start];
}
numbers[start] = index;
return start;
}
//==================方法一:partition========================
public static int moreThanHalfNum_solution1(int[] numbers, int length) {
if (checkInvalidArray(numbers, length)) {
return 0;
}
int middle = length >> 1;
int start = 0;
int end = length - 1;
int index = Partition(numbers, length, start, end);
while (index != middle) {
if (index > middle) {
end = index - 1;
index = Partition(numbers, length, start, end);
} else {
start = index + 1;
index = Partition(numbers, length, start, end);
}
}
int result = numbers[middle];
if (!checkMoreThanHalf(numbers, length, result)) {
result = 0;
}
return result;
}
public static int moreThanHalfNum_solution2(int[] numbers, int length) {
if (checkInvalidArray(numbers, length)) {
return 0;
}
int result = numbers[0];
int times = 1;
for(int i = 1; i < length; i++){
if (times == 0){
result = numbers[i];
times = 1;
}
else if(numbers[i] == result){
times ++;
}else{
times--;
}
}
if (!checkMoreThanHalf(numbers, length, result)) {
result = 0;
}
return result;
}
// ====================测试代码====================
public static void Test(String testName, int[] numbers, int length, int expectedValue, boolean expectedFlag)
{
if(testName != null)
System.out.println("\n"+testName+" begins: ");
int[] copy = new int[length];
for(int i = 0; i < length; ++i)
copy[i] = numbers[i];
System.out.printf("Test for solution1: ");
int result = moreThanHalfNum_solution1(numbers, length);
if(result == expectedValue && g_bInputInvalid == expectedFlag)
System.out.println("Passed.");
else
System.out.println("Failed.");
System.out.printf("Test for solution2: ");
result = moreThanHalfNum_solution2(copy, length);
if(result == expectedValue && g_bInputInvalid == expectedFlag)
System.out.println("Passed.");
else
System.out.println("Failed.");
copy = null;
}
// 存在出现次数超过数组长度一半的数字
public static void Test1()
{
int numbers[] = {1, 2, 3, 2, 2, 2, 5, 4, 2};
Test("Test1", numbers, numbers.length, 2, false);
}
// 不存在出现次数超过数组长度一半的数字
public static void Test2()
{
int numbers[] = {1, 2, 3, 2, 4, 2, 5, 2, 3};
Test("Test2", numbers, numbers.length, 0, true);
}
// 出现次数超过数组长度一半的数字都出现在数组的前半部分
public static void Test3()
{
int numbers[] = {2, 2, 2, 2, 2, 1, 3, 4, 5};
Test("Test3", numbers, numbers.length, 2, false);
}
// 出现次数超过数组长度一半的数字都出现在数组的后半部分
public static void Test4()
{
int numbers[] = {1, 3, 4, 5, 2, 2, 2, 2, 2};
Test("Test4", numbers, numbers.length, 2, false);
}
// 数组为1个元素
public static void Test5()
{
int numbers[] = {1};
Test("Test5", numbers, 1, 1, false);
}
// 输入空指针
public static void Test6()
{
Test("Test6", null, 0, 0, true);
}
public static void main(String[] args)
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
}
}
Test1 begins:Test for solution1: Passed.Test for solution2: Passed. Test2 begins:Test for solution1: the number you find is not more than half.Passed.Test for solution2: the number you find is not more than half.Passed. Test3 begins:Test for solution1: Passed.Test for solution2: Passed. Test4 begins:Test for solution1: Passed.Test for solution2: Passed. Test5 begins:Test for solution1: Passed.Test for solution2: Passed. Test6 begins:Test for solution1: Numbers is null! Invalid Parameters.Passed.Test for solution2: Numbers is null! Invalid Parameters.Passed. Process finished with exit code 0
P163、面试题29:数组中出现次数超过一半的数字的更多相关文章
- 剑指Offer:面试题29——数组中出现次数超过一半的数字(java实现)
PS:在前几天的面试中,被问到了这个题.然而当时只能用最低效的方法来解. 问题描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2, ...
- 《剑指offer》面试题39. 数组中出现次数超过一半的数字
问题描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 你可以假设数组是非空的,并且给定的数组总是存在多数元素. 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, ...
- 面试题五 数组中出现次数超过一半的数字 时间为O(n)
也就是说 该数字出现的次数比其他所有数字出现次数的和还要多. 因此可以保存两个值,一个数字,一个次数. 遍历时 1.如果数字相同,count++ 2.如果count == 0 count = 1 nu ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
- 九度OJ 1370 数组中出现次数超过一半的数字
题目地址:http://ac.jobdu.com/problem.php?pid=1370 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2 ...
- 《剑指offer》第三十九题(数组中出现次数超过一半的数字)
// 面试题39:数组中出现次数超过一半的数字 // 题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例 // 如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, ...
- 数组中出现次数超过一半的数字 -java
数组中出现次数超过一半的数字 -java 方法一: 数组排序,然后中间值肯定是要查找的值. 排序最小的时间复杂度(快速排序)O(NlogN),加上遍历. 方法二: 使用散列表的方式,也就是统计每个数组 ...
- 【C语言】统计数组中出现次数超过一半的数字
//统计数组中出现次数超过一半的数字 #include <stdio.h> int Find(int *arr, int len) { int num = 0; //当前数字 int ti ...
- 《剑指offer》— JavaScript(28)数组中出现次数超过一半的数字
数组中出现次数超过一半的数字 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超 ...
- 剑指Offer - 九度1370 - 数组中出现次数超过一半的数字
剑指Offer - 九度1370 - 数组中出现次数超过一半的数字2013-11-23 03:55 题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组 ...
随机推荐
- nginx的安装与配置
1.nginx的安装与配置 编译安装nginx需要实现安装开发包组“Development tools”和“Server Platform Development”.“Desktop Platform ...
- qml实现自定义标题栏按钮
自定义的标题栏按钮是由Rectangle来实现的,在Rectangle中需要4张图片,分别在鼠标进入按钮区.鼠标离开按钮区(正常状态下).鼠标按下和鼠标释放时所加载的图片.下面是实现自定义按钮的代码( ...
- AVA取整以及四舍五入
AVA取整以及四舍五入 import java.math.BigDecimal; public class Test { public static void main(String[] args) ...
- [Interview][CodingExam]
這次去Interview, 其中有一個公司 把我列為 2/25的考慮對象, 在Final 的 1/2, 我被刷掉了. 因為第一輪的程式,我稍微google了一下,參考了既有的寫法. 即使第二輪我用完全 ...
- 几种placeholder替换项目参数的方法比较
引言:(引自:http://openwebx.org/docs/autoconfig.html) 在一个应用中,我们总是会遇到一些参数,例如: 数据库服务器IP地址.端口.用户名: 用来保存上传资料的 ...
- 快速搭建Web环境 Angularjs + Express3 + Bootstrap3
快速搭建Web环境 Angularjs + Express3 + Bootstrap3 AngularJS体验式编程系列文章, 将介绍如何用angularjs构建一个强大的web前端系统.angula ...
- 深入理解jsavascript的作用域
一. JavaScript声明提前 在JavaScript中如果不创建变量,直接去使用,则报错: console.log(xxoo); // 报错:Uncaught ReferenceError: x ...
- SQL Server是如何让定时作业
如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时,可以用管理->SQL Server代理->作业来实现. 1.管理->SQL S ...
- 动态LINQ构建(实现等于不等于大于小于,like以及IN)
首先感谢园子里的“红烧狮子头”,他的工作是本文的基础,引文如下http://www.cnblogs.com/daviddai/archive/2013/03/09/2952087.html,本版本实现 ...
- 选中excel中的对象
2007在查找和选择中点击“选择对象”,然后再全选全个sheet(ctrl+a)就可以看到了. 2010 “选择对象”在 开始——查找和选择——选择对象