您的位置:首页 > 移动开发 > 微信开发

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

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

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

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

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

数组的复制

  数组的复制,当然可以通过for循环来完成,但是这样效率太低;也可以通过数组对象本身的clone()方法来实现,但是这样是不能指定复制的内容的。

  利用System.arraycopy(),可以灵活、高效地完成数组指定内容的复制 ,在Java中复制数组时,应优先考虑这种方法。

数组长度的调整

  在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等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: