统计数组中元素出现的次数——Java小程序

来源:互联网 发布:配眼镜 知乎 编辑:程序博客网 时间:2024/06/03 12:45

   这段小代码,是在阅读了这篇博文后,作为练习写出来的,原文中,作者做了很详细的分析,在此根据自己的理解整理出了这篇博客。

   原题是,给定一个int数组,找出数组中出现次数为奇数的数字。最终决定建立一个以数组元素为索引的数组,数组中的元素的值即为对应的数字出现的次数。由于数字出现的次数仅有奇偶之分,因此可以只用0和1以示区别。

   以上所说的解法,最大的问题在于所创建的索引数组的大小该如何确定,如果已知待处理的数组中的最大数字,那么以此作为长度即可;如果不知道,那么要么设置一个比较大的数字(如Integer.MAX_VALUE),要么根据先设置一个初值,然后根据需要对索引素组进行扩容,为了节约存储空间,我采用第二种方法。

   关于数组的操作,我觉得有两个方法很重要:

  1. 数组的复制
      数组的复制,当然可以通过for循环来完成,但是这样效率太低;也可以通过数组对象本身的clone()方法来实现,但是这样是不能指定复制的内容的。
      利用System.arraycopy(),可以灵活、高效地完成数组指定内容的复制 ,在Java中复制数组时,应优先考虑这种方法。
  2. 数组长度的调整
      在Java中,数组一经建立,其长度是不能改变的。利用Arrays.copyOf(),可以得到一个新的数组,数组长度通过参数指定,原数组中的内容会保留,但是会根据新数组的长度对内容进行删减或者以0填充。
      究其本质,原数组并没有改变,只是根据指定的长度创建了一个新的数组,然后将原数组中的内容复制过去,最后返回新的数组。

   以下就是最终的代码

import java.util.Arrays;public class OddTimes {  static int [] numbers;    private int maxNum = 10;    private int increment = 10;    public OddTimes() {        numbers = new int [maxNum];        }    public OddTimes(int [] data) {        int length = data.length;        if (length == 0) {            numbers = new int [maxNum];        } else {            numbers = new int [length];            System.arraycopy(data,0,numbers,0,length);            }        }    public static void main(String [] args) {        int [] data = {1,1,2,3,5,3,6,8,0,7,2,3,8,3,4,4,4,5,5,5,5,11,33} ;        OddTimes ot = new OddTimes(data);        ot.fillIndex();        }    public void fillIndex() {        int [] index = new int [maxNum];        int mask = 0x1;        for (int element : numbers) {            if (element >= index.length) {                int temp = element/increment+1;                index = Arrays.copyOf(index,temp*increment);                }            index[element] = index[element] ^ mask;            }        System.out.println("The numbers below appeared odd times:");        for (int i=0; i<index.length; i++) {            if (index[i] != 0) {                System.out.print(i + "\t");                }            }        }    }

   代码中,利用按位异或(^)1的方式来实现在0和1之间的转变。原文中,作者还做了更多的分析,有兴趣的朋友不妨看看。

   如果处于节约空间的考虑,可以将index数组由int数组,换成boolean数组,通过元素值为true或false来区别奇偶。当然,如果要统计具体的次数,那么用boolean就不太合适了,但是可以考虑byte、short等。

0 0
原创粉丝点击