A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 仙锄 中级黑马   /  2017-11-18 00:12  /  1070 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

这是上课写的一个统计数组中每个元素出现个数的代码,我写出来了,但是特别笨重,想请大家帮我优化一下


import java.util.Scanner;
public class Test07 {训练6
        public static void main(String[] args){
                int arr[]=new int[]{-2,1,0,-5,4,23,2,1,4,1-5,-22,4,1,3,3,4,6,7,9,-2,999999,-999999};
                int arr[]=new int[]{-2,1,11,3,4,1,8,0,1,4,9,1,4,1,3,3,4,6,7,9,-2};
                panDuan(arr);
        }
        public static void panDuan(int[] arr){
                int max=arr[0];
                int min=arr[0];
                for(int i=1;iarr.length;i++){
                        if(maxarr[i]){判断元素中最大的数值,用来作为计数数组的长度
                                max=arr[i];
                        }
                        if(minarr[i]){判断元素中最小的数值,用来作为负数计数数组的长度
                                min=arr[i];
                        }
                }
                if(max=0){
                        int num1[]=new int[max+1];用来计数的数组,角标从0开始,所以要+1
                        for(int i=0;iarr.length;i++){正数数组的
                                if(arr[i]0){小于0跳出本次循环
                                        continue;
                                }
                                num1[arr[i]]+=1;那个数字出现那个数字的角标就+1
                        }
                        printArray(num1);
                }
                if (min0){
                        int a=min;
                        a=Math.abs(a);
                        int[] num2 =new int[Math.abs(min)];如果最小值小于0.那么取绝对值作为记录负数数组的长度
                       
                        for(int i=0;iarr.length;i++){正数数组的
                                if(arr[i]=0){大于等于0跳出本次循环
                                        continue;
                                }
                                num2[0-arr[i]-1]+=1;用负数取反-1的角标值来记录负数出现的次数
                        }
                        printArray1(num2);
                }
               
        }
        public static void printArray1(int[] arr){打印负数数组
                for(int i=0;iarr.length;i++){
                        if(arr[i]0){如果角标上的数字,大于0,说明至少出现过1次
                                System.out.println(hhhh);
                                System.out.println((0-i-1)+出现了+arr[i]+次);
                        }
                }
        }
        public static void printArray(int[] arr){打印正数部分
                for(int i=0;iarr.length;i++){
                        if(arr[i]0){如果角标上的数字,大于0,说明至少出现过1次
                                System.out.println(i+出现了+arr[i]+次);
                        }
                }
        }

}

2 个回复

倒序浏览
EYE_SEE_YOU 来自手机 高级黑马 2017-11-18 08:20:26
沙发
不是很懂,按照你的题意int类型的数组直接排序后开始对比角标,假设第0位第1位相同,第2位不同,用2个变量记录初始角标和最近不同值角标,第一次分别对应角标0和角标2,输出后者角标减去前者角标即是相同值个数,下一次计算以刚才的最近不同值角标为初始值角标继续运算

点评

意思是,如果数组中出现5,那么角标为5的数值就+1,如果是-5,那就是角标为(-5的绝对值-1)的角标值+1,然后通过遍历数组来得到元素出现的次数  发表于 2017-11-22 01:04
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马