面试29: 数组中出现次数超过一半的数字
来源:互联网 发布:淘宝物流显示其他物流 编辑:程序博客网 时间:2024/06/05 09:00
一. 题目
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.
代码请到我的代码库中下载 Point2Offer
二. 代码
package com;/** * 剑指offer: 数组中出现次数超过一半的数字 * 方法:1.排序,中位数(改变了数组);2.数字排列规律(过半,不管怎么消,都会剩下1) * 测试用例:功能测试(数组中存在,不存在这样的数字) * 特殊输入测试(数组只有一个数字,数组为空) * @author dingding * Date:2017-6-16 14:00 * Declaration: All Rights Reserved! */public class MoreThanHalfNumber { static boolean inputInvalid = false; public static void main(String[] args) { test1(); test2(); } //方法2:统计规律(更简单) private static int findMoreThanHalfNum_2(int[] arr,int length){ if (checkInvalidArray(arr, length)) { return 0; //TODO:处理过半为0 } int result = arr[0]; int times = 1; for (int i=0;i<length;i++){ if (times == 0) { result = arr[i]; times=1; }else if (arr[i]==result) { times++; }else{ times--; } } if (!checkMoreThanHalf(arr, length, result)) { result = 0; } return result; } //方法1:快排 private static int findMoreThanHalfNum_1(int[] arr,int length){ if (checkInvalidArray(arr,length)) { return 0; } int middle = length>>1; //取中间的数 int start = 0; int end = length-1; int index = partition(arr,length,start,end); while (index!=middle){ if (index>middle) { end = index-1; index = partition(arr, length, start, end); }else { start = index+1; index = partition(arr, length, start, end); } } int result = arr[middle]; // System.out.println(index+"==?"+middle); if (!checkMoreThanHalf(arr,length,result)) { return 0; } return result; } //获取数组分片位置 private static int partition(int[] arr, int length, int start, int end) { int i = start-1; int x = arr[end]; for (int j=start;j<end;j++){ if (arr[j]<=x) { i++; swap(arr,i,j); } } swap(arr,i+1,end); return i+1; } //交换位置 private static void swap(int[] arr, int i, int j) { int temp; temp = arr[i]; arr[i] = arr[j]; arr[j] =temp; } //检查是否过半 private static boolean checkMoreThanHalf(int[] arr, int length, int result) { int times = 0; for (int i=0;i<length;i++){ if (arr[i]==result) { times++; } } boolean isMoreThanHalf = true; if (times*2 <= length) { isMoreThanHalf = false; inputInvalid = true; } return isMoreThanHalf; } //判断输入的数组是否有效 private static boolean checkInvalidArray(int[] arr, int length) { if (arr == null||length<=0) { inputInvalid = true; } return inputInvalid; } /*======================测试用例================*/ ////方法1结果 private static void test1() { System.out.println("方法1: "); int[] numbers = {1}; int result = findMoreThanHalfNum_1(numbers,numbers.length); if (result==0) { System.out.println("Not Found!"); }else { System.out.println(result); } } //方法2结果 private static void test2(){ System.out.println("方法1: "); int[] numbers = {1, 2, 3, 2, 2, 2, 5, 4, 2}; int result = findMoreThanHalfNum_2(numbers,numbers.length); if (result==0) { System.out.println("Not Found!"); }else { System.out.println(result); } }}
有不妥当之处,麻烦告知:D
阅读全文
0 0
- 面试29: 数组中出现次数超过一半的数字
- 面试训练数组中出现次数超过一半的数字
- 29数组中出现次数超过一半的数字
- 29 - 数组中出现次数超过一半的数字
- 29-数组中出现次数超过一半的数字
- 数组中超过出现次数超过一半的数字
- 74.数组中超过出现次数超过一半的数字
- 74 数组中超过出现次数超过一半的数字
- 【数组4】数组中出现次数超过一半的数字
- 数组4:数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字的算法 程序员面试47
- 面试算法(二十八)数组中出现次数超过一半的数字
- 数组中超过出现次数一半的数字 【微软面试100题 第七十四题】
- 面试-剑指offer-数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- 找出数组中出现次数超过长度一半的数字
- 2-数组中出现次数超过一半的数字
- 数组中出现次数超过一半的数字
- Codeforces 816C Karen and Game【思维】
- CTC学习笔记(二) 训练和公式推导
- C函数之memcpy()函数用法
- 结构体
- 欢迎使用CSDN-markdown编辑器
- 面试29: 数组中出现次数超过一半的数字
- HashSet实现原理
- java的StringBuffer和StringBuilder
- java集合-ArrayList学习笔记
- Java 如何将Array转换为Stream
- 分享首北岛的诗《一切》
- 解决:错误1error C2440: “初始化”: 无法从“char *”转换为“ATL::CStringT<BaseType,StringTraits>
- 一些程序员的毛病
- 书籍阅读计划