统计数组中元素出现的次数——Java小程序
2015-07-23 16:43
645 查看
这段小代码,是在阅读了这篇博文后,作为练习写出来的,原文中,作者做了很详细的分析,在此根据自己的理解整理出了这篇博客。
原题是,给定一个int数组,找出数组中出现次数为奇数的数字。最终决定建立一个以数组元素为索引的数组,数组中的元素的值即为对应的数字出现的次数。由于数字出现的次数仅有奇偶之分,因此可以只用0和1以示区别。
以上所说的解法,最大的问题在于所创建的索引数组的大小该如何确定,如果已知待处理的数组中的最大数字,那么以此作为长度即可;如果不知道,那么要么设置一个比较大的数字(如Integer.MAX_VALUE),要么根据先设置一个初值,然后根据需要对索引素组进行扩容,为了节约存储空间,我采用第二种方法。
关于数组的操作,我觉得有两个方法很重要:
数组的复制
数组的复制,当然可以通过for循环来完成,但是这样效率太低;也可以通过数组对象本身的clone()方法来实现,但是这样是不能指定复制的内容的。
利用System.arraycopy(),可以灵活、高效地完成数组指定内容的复制 ,在Java中复制数组时,应优先考虑这种方法。
数组长度的调整
在Java中,数组一经建立,其长度是不能改变的。
利用Arrays.copyOf(),可以得到一个新的数组,数组长度通过参数指定,原数组中的内容会保留,但是会根据新数组的长度对内容进行删减或者以0填充。
究其本质,原数组并没有改变,只是根据指定的长度创建了一个新的数组,然后将原数组中的内容复制过去,最后返回新的数组。
以下就是最终的代码
代码中,利用按位异或(^)1的方式来实现在0和1之间的转变。原文中,作者还做了更多的分析,有兴趣的朋友不妨看看。
如果处于节约空间的考虑,可以将index数组由int数组,换成boolean数组,通过元素值为true或false来区别奇偶。当然,如果要统计具体的次数,那么用boolean就不太合适了,但是可以考虑byte、short等。
原题是,给定一个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等。
相关文章推荐
- java版微信支付
- 微信应用签名生成工具
- iOS下微信语音播放之切换听筒和扬声器的方法解决方案
- 微信整合的时候 出现这个“redirect_uri 参数错误”
- Android ActionBar应用实战,高仿微信主界面的设计
- 微信公众号怎么推送消息_微信公众号发送消息
- 微信号和微信公众号有什么区别
- 如何注册一个微信公众号
- 用Go写了一个类似Proxy的小程序,可以用来访问goolge个人使用还是可以的.
- 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码
- 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo
- 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台
- 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台
- 微信开放平台公众号第三方平台开发 教程一 平台介绍
- 使用图灵api创建微信聊天机器人
- 【Android微信开发】微信开发平台安卓版(二)
- 在Hadoop2.2.0上运行Wordcount小程序
- 没有微信api提示浏览器微信分享按钮的位置
- 【Android微信开发】关于开发微信开放平台安卓版(一)
- 【IOS】简单的测试银联和微信支付