剑指Offer-29

来源:互联网 发布:白云学院网络教学平台 编辑:程序博客网 时间:2024/06/14 16:33

题目:

数组中出现次数超过一半的数字。

实现:

public class Solution29 {    public static int findMoreThanHalf(int[] nums){        if(nums==null || nums.length<1){            System.out.println("数组为空");            return 0;        }        int middle = nums.length>>1;        int start = 0;        int end = nums.length-1;        int index = partition(nums,start,end);        while (index!=middle){            if(index>middle){                end = index-1;            }            else {                start = index+1;            }            index = partition(nums,start,end);        }        int result = nums[middle];        if(check(nums,result)){            return result;        }        System.out.println("数组中没有出现次数超过一半的数字");        return 0;    }    public static boolean check(int[] nums,int num){       boolean result = false;       int time = 0;       for(int i=0;i<nums.length;i++){           if(nums[i]==num){               time++;           }       }       if(time>(nums.length>>1)){           result = true;       }       return result;    }    public static int partition(int[] nums,int start,int end){        int pivot = nums[start];        while (start<end){            while (start<end && nums[end]>=pivot){                end--;            }            nums[start]=nums[end];            while (start<end && nums[start]<=pivot){                start++;            }            nums[end]=nums[start];        }        nums[start] = pivot;        return start;    }    public static void main(String[] args) {        // 存在出现次数超过数组长度一半的数字        int numbers[] = {1, 2, 3, 2, 2, 2, 5, 4, 2};        System.out.println(findMoreThanHalf(numbers));        // 出现次数超过数组长度一半的数字都出现在数组的前半部分        int numbers2[] = {2, 2, 2, 2, 2, 1, 3, 4, 5};        System.out.println(findMoreThanHalf(numbers2));        // 出现次数超过数组长度一半的数字都出现在数组的后半部分        int numbers3[] = {1, 3, 4, 5, 2, 2, 2, 2, 2};        System.out.println(findMoreThanHalf(numbers3));        // 只有一个数        int numbers4[] = {1};        System.out.println(findMoreThanHalf(numbers4));        //输入null        System.out.println(findMoreThanHalf(null));        // 不存在出现次数超过数组长度一半的数字        int numbers5[] = {1, 2, 3, 2, 4, 2, 5, 2, 3};        System.out.println(findMoreThanHalf(numbers5));    }}
原创粉丝点击