noaman_wgs

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
* 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。
* 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
* 【思路】首先取第一个数,之后的数与其比较。相同次数+1;不同次数-1.次数=0的时候将第一个数改为次数保存并将次数设置为1.
* 这里要考虑到如果出现次数最多的数字没有达到一半的话,就返回0;

 1 package com.exe11.offer;
 2 
 3 /**
 4  * 【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
 5  *           例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。
 6  *           由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
 7  * 【思路】首先取第一个数,之后的数与其比较。相同次数+1;不同次数-1.次数=0的时候将第一个数改为次数保存并将次数设置为1.
 8  *                这里要考虑到如果出现次数最多的数字没有达到一半的话,就返回0;
 9  * @author WGS
10  *
11  */
12 public class MoreThanHalfNumber {
13     
14     boolean isValid=true;//全局变量用来表示次数没有一半情况
15     
16     public int getMoreThanHalfNumber(int[] nums){
17         
18         if(nums==null || nums.length<=0) return 0;
19         int index=0;
20         int times=0;
21         int target=nums[index];
22         
23         while(index<nums.length){
24             if(times==0){
25                 target=nums[index];
26                 times=1;
27             }else if(nums[index]==target){
28                 times++;
29             }else{//nums[index]!=target
30                 times--;
31             }
32             index++;
33         }
34         //如果出现次数最多的数字没有达到数组长度一半的话,就返回0;
35         int times2=0;
36         for(int i=0;i<nums.length;i++){
37             if(nums[i]==target){
38                 times2++;
39             }            
40         }
41         if(2*times2<=nums.length){
42             isValid=false;
43             return 0;
44         }
45         
46         System.out.println(isValid);
47         return target;
48                 
49     }
50     
51     public static void main(String[] args) {
52         MoreThanHalfNumber m=new MoreThanHalfNumber();
53         int[] nums=new int[]{1,2,3,2,5,4,2};
54         int n=m.getMoreThanHalfNumber(nums);
55         System.out.println(n);
56     }
57 }

 

posted on 2016-07-01 12:59  noaman_wgs  阅读(129)  评论(0编辑  收藏  举报