黑马程序员技术交流社区

标题: 代码求优化 [打印本页]

作者: 仙锄    时间: 2017-11-18 00:12
标题: 代码求优化
这是上课写的一个统计数组中每个元素出现个数的代码,我写出来了,但是特别笨重,想请大家帮我优化一下


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]+次);
                        }
                }
        }

}

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




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2