zoukankan      html  css  js  c++  java
  • 找出整数数组中出现次数超过数组长度一半的元素(Java)

    Question:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字

    package com.study.zhipengs.test;
    
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 
     * 例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4,
     * 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.
     * 
     * 所有数字的个数均没有超过数组长度的一半,则返回-1
     * 
     * @author zhipegs
     * 
     */
    public class Test {
        
        public static void main(String[] args) {
            int[] numbers = { 1, 2, 2, 5, 6, 2, 5, 2, 2};
            System.out.println("number: " + mapSolve(numbers));
            System.out.println("number: " + sortSolve(numbers));
        }
    
        /**
         * 先排序---排序后统计每个数字出现的次数,出现次数超过数组长度一半的那个一定出现在中间
         * @param numbers
         * @return int
         */
        private static int sortSolve(int[] numbers) {
            Arrays.sort(numbers);
            int count = 0;
            int len = numbers.length;
            int pos = (int) Math.rint((double)len/2.0);
            int midValue = numbers[pos];
            for(int i=0;i<len;i++) {
                if(numbers[i] == midValue) {
                    count ++;
                    if(count > pos) {
                        return midValue;
                    }
                }
            }
            return -1;
        }
    
        /**
         * 不排序--相同数字存储到Map的key中,个数在value中递增计算
         * @param numbers
         * @return int
         */
        private static int mapSolve(int[] numbers) {
            int len = numbers.length;
            int pos = (int) Math.rint((double)len/2.0);
            Map<String,MyInteger> map = new HashMap<String,MyInteger>();
            MyInteger mi;
            for(int i=0;i<numbers.length;i++) {
                String key = numbers[i]+"";
                mi = map.get(key);
                if(mi != null) {
                    int value = mi.get()+1;
                    mi.set(value); 
                    map.put(key, mi);
                    if(value > pos) {
                        return numbers[i];
                    }
                    continue;
                }
                mi = new MyInteger();
                mi.set(1);
                map.put(key, mi);
            }
            return -1;
        }
    
    }
    
    /**
     * 自定义MyInteger
     */
    class MyInteger {
        private int value;
    
        public void set(int value) {
            this.value = value;
        }
    
        public int get() {
            return this.value;
        }
        
        @Override
        public String toString() {
            return "MyInteger [value=" + value + "]";
        }
    }

    总结:多看书和博客,从别人的代码分享中理解思路,越思越明~~

  • 相关阅读:
    集合的一些操作总结
    字符串的操作
    python字典的操作总结
    python中的列表知识总结
    Python利用文件操作实现用户名的存储登入操作
    如何理解:城市的“信息化→智能化→智慧化”
    程序员必备技能-怎样快速接手一个项目
    程序员的职业规划
    只要 8 个步骤,学会这个 Docker 命令终极教程!
    使用GitLab实现CI/CD
  • 原文地址:https://www.cnblogs.com/once/p/3746478.html
Copyright © 2011-2022 走看看