【题目】数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
* 例如输入一个长度为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 }
时间: 2024-11-12 01:04:43