圣思源Java视频36节练习源码分享(自己的190+行代码对比老师的39行代码)
题目:
* 随机生成50个数字(整数),每个数字范围是[10,50],统计每个数字出现的次数
* 以及出现次数最多的数字与它的个数,最后将每个数字及其出现次数打印出来,
* 如果某个数字出现次数为0,则不要打印它。打印时按照数字的升序排列。
要求:
* 使用数组的知识完成此功能,不能使用JDK的API函数。
分析:
* 需要写一个随机数生成函数
* 需要写一个冒泡排序函数
* 需要写一个二分查找获取数组中某元素个数的函数
代码如下:
package Array32; /**
* 随机生成50个数字(整数),每个数字范围是[10,50],统计每个数字出现的次数 以及出现次数最多的数字与它的个数,最后将每个数字及其出现次数打印出来,
* 如果某个数字出现次数为0,则不要打印它。打印时按照数字的升序排列。
*
* @author Administrator
*
*/
public class ArrayHomeTest { public static void main(String[] args) {
int[] array = new int[50];
// 生成10,50间的随机数的数组
for (int i = 0; i < 50; i++) {
array[i] = RandomInt(10, 50);
} // 处理前打印数组
System.out.println("当前生成的随机数组如下:");
PrintArray(array);
System.out.println("-------------------"); // 为这个数组排序
BubbleSortX(array); // 获取存储次数的数组(j - 10默认为指定数字与序号的一个交叉引用……实际上这样写不好,应改善)
int sum[] = new int[41];
for (int j = 10; j <= 50; j++) {// 对比10-50中的元素与array中的元素
sum[j - 10] = binarySearchGetNum(array, j);
}
// 获取最多的次数(获取数组中的最大数)
int sumAfterSort[] = BubbleSort(sum);
int maxTimes = sumAfterSort[sumAfterSort.length - 1];// 升序排序后的最大
// 找到最大次数对应的所有数字
System.out.println("出现最多的数字为有:");
for (int i = 0; i < sum.length; i++) {
if (sum[i] == maxTimes) {
int num = i + 10;// i + 10默认为指定数字与序号的一个交叉引用……实际上这样写不好,应改善
System.out.print(num + "|");
}
}
System.out.println();
System.out.println("出现次数为:" + maxTimes);
System.out.println("-------------------"); // 打印所有的出现的数字
System.out.println("数字|出现次数");
for (int i = 0; i < sum.length; i++) {
if (sum[i] != 0) {
System.out.printf("%4s", i + 10);
System.out.print("|");
System.out.printf("%8s", sum[i]);
System.out.println();
}
}
} /**
* 生成int随机数,范围fromNum-toNum
*
* @param fromNum
* 开始数字
* @param toNum
* 结束数字
* @return int随机数
*/
public static int RandomInt(int fromNum, int toNum) {
return (int) (Math.random() * (toNum - fromNum) + fromNum);
} /**
* 简单冒泡排序
*
* @param a
*/
public static void BubbleSortX(int[] a) { for (int i = 0; i < a.length - 1; i++) {
for (int j = 0; j < a.length - 1 - i; j++) {
if (a[j] > a[j + 1]) {// 升序
int temp;
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
} } /**
* 不影响原数组的情况下的冒泡排序
*
* @param a
* @return
*/
public static int[] BubbleSort(int[] a) {
int length = a.length;
int[] rtnArray = new int[length]; // 向rtnArray中赋值,复制一个a
for (int i = 0; i < a.length; i++) {
rtnArray[i] = a[i];
} // 冒泡排序
for (int i = 0; i < rtnArray.length - 1; i++) {
for (int j = 0; j < rtnArray.length - 1 - i; j++) {
if (rtnArray[j] > rtnArray[j + 1]) {// 升序
int temp;
temp = rtnArray[j];
rtnArray[j] = rtnArray[j + 1];
rtnArray[j + 1] = temp;
}
}
} return rtnArray;
} /**
* 二分查找返回个数
*
* @param array数组必须有序
* @param value
* @return 返回个数
*/
public static int binarySearchGetNum(int[] array, int value) {
int low = 0;// 待查找的下限
int high = array.length - 1;// 待查找的上限
int middle = 0;// 上限与下限的中间位置 int returnValue = 0; while (low <= high) {
middle = (low + high) / 2; if (array[middle] == value) {
returnValue++;// 当中间数与value相等时,计数+1 // 从middle向low的方向移位,判断low侧是否有相等的(因为已经完成排序了)
int tempMiddle = middle;
if (tempMiddle > low) {
while (tempMiddle > low) {
tempMiddle--;
if (array[tempMiddle] == value) {
returnValue++;
} else {// 遇到第一个不同的地方跳出
break;
}
}
} // 从middle向high的方向移位,判断high侧是否有相等的(因为已经完成排序了)
tempMiddle = middle;
if (tempMiddle < high) {
while (tempMiddle < high) {
tempMiddle++;
if (array[tempMiddle] == value) {
returnValue++;
} else {// 遇到第一个不同的地方跳出
break;
}
}
}
return returnValue;
} else if (value < array[middle]) {
high = middle - 1;
} else if (value > array[middle]) {
low = middle + 1;
}
} return returnValue;
} /**
* 打印指定数组
*
* @param array
*/
public static void PrintArray(int[] array) {
if (array == null) {
return;
}
for (int i = 0; i < array.length; i++) {
System.out.print(array[i] + " ");
}
System.out.println();
}
}
返回结果如下:
当前生成的随机数组如下:
44 43 36 37 36 26 31 42 45 19 11 24 33 43 28 33 35 48 20 35 35 49 45 48 45 18 34 46 47 12 41 31 10 19 15 21 20 44 16 17 14 31 29 19 43 29 32 21 39 44
-------------------
出现最多的数字为有:
19|31|35|43|44|45|
出现次数为:3
-------------------
数字|出现次数
10| 1
11| 1
12| 1
14| 1
15| 1
16| 1
17| 1
18| 1
19| 3
20| 2
21| 2
24| 1
26| 1
28| 1
29| 2
31| 3
32| 1
33| 2
34| 1
35| 3
36| 2
37| 1
39| 1
41| 1
42| 1
43| 3
44| 3
45| 3
46| 1
47| 1
48| 2
49| 1
结语:
这是自己在从C#转Java中遇到第一个手工编写的Java程序练习,主要用到了数组的知识,数据结构的知识,此外需要对于Java中的引用类型和原生数据类型的传值有一定的认识。
代码本身还不是很完善啦,如常量定义,循环的简化处理等,可以做为一个参考,其中的二分查找、冒泡排序函数都可以改进以及override出更加强大的函数。
仅作为抛砖引玉,还没有深入考虑代码的优化,老师的代码我也还没看,估计比我写的好看的多。
2015-4-8 0:15:33
补充视频中老师的方法,39行代码秒杀。
public static void TeachersWay(){
int[] count = new int[41];
Random random = new Random();
//生成随机数
for(int i = 0; i < 50; i++){
int number = random.nextInt(41) + 10;//[10, 50]
count[number - 10]++;
}
//显示每个随机数的出现次数
for(int i = 0; i < count.length; i ++){
if(0 == count[i]){
continue;
}
System.out.println((10 + i) + "出现次数:" + count[i]);
}
int max = count[0];
//获取次数中的最大值
for(int i = 0; i < count.length ; i++){
if(max < count[i]){
max = count[i];
}
}
System.out.println("出现的最大次数为:" + max + "次");
System.out.println("最大的数有:");
//多余的循环打印出最大的数,实际上可以与上面的获取次数最大值合并
for(int i = 0; i < count.length; i ++){
if(max == count[i]){
System.out.println(i + 10);
}
}
}
返回结果如下:
10出现次数:2
11出现次数:2
12出现次数:1
14出现次数:4
15出现次数:2
16出现次数:1
18出现次数:2
19出现次数:1
20出现次数:2
22出现次数:3
23出现次数:1
24出现次数:3
26出现次数:3
27出现次数:1
28出现次数:1
29出现次数:3
30出现次数:1
32出现次数:1
34出现次数:2
35出现次数:1
37出现次数:1
38出现次数:1
40出现次数:1
42出现次数:1
44出现次数:1
45出现次数:2
48出现次数:4
50出现次数:2
出现的最大次数为:4次
最大的数有:
14
48
第二次总结:
对于比较大小的方法有些遗忘了,实际上老师这个方法才是比较大小的好方法。排序再去取最大值,效率上有所降低的。
整体思路上还需要改进,利用序号0~40与实际范围10~50之间差10的关系,可以大量简化代码。
圣思源Java视频36节练习源码分享(自己的190+行代码对比老师的39行代码)的更多相关文章
- 图解 Java IO : 二、FilenameFilter源码
Writer :BYSocket(泥沙砖瓦浆木匠) 微 博:BYSocket 豆 瓣:BYSocket FaceBook:BYSocket Twitter ...
- 500G JAVA视频网盘分享 (Jeecg社区)
http://blog.csdn.net/zhangdaiscott/article/details/18220411 csdn 排名400多名 500 G JAVA视频网盘分享(Jeecg社区 ...
- Java 使用blob对H5视频播放进行加密《java视频加密》
1.创建一个H5 <video>标签 <video id="sound" type="video/mp4" controls="co ...
- 500 G JAVA视频网盘分享(JEECG开源社区)
500 G JAVA视频网盘分享(JEECG开源社区) [涵盖从java入门到深入架构,Linux.云计算.分布式.大数据Hadoop.ios.Android.互联网技术应有尽有] [转载:h ...
- 500G JAVA视频网盘分享 (JEECG开源社区)
500 G JAVA视频网盘分享(JEECG开源社区) [涵盖从java入门到深入架构,Linux.云计算.分布式.大数据Hadoop.ios.Android.互联网技术应有尽有] J ...
- JAVA视频网盘分享
JAVA视频网盘分享 [涵盖从java入门到深入架构,Linux.云计算.分布式.大数据Hadoop.ios.Android.互联网技术应有尽有] 1.JavaScript视频教程 链接: http: ...
- Android零基础入门第36节:Android系统事件的响应
原文:Android零基础入门第36节:Android系统事件的响应 在开发Android应用时,有时候可能需要让应用程序随系统设置而进行调整,比如判断系统的屏幕方向.判断系统方向的方向导航设备等.除 ...
- 死磕 java同步系列之ReentrantLock源码解析(二)——条件锁
问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等 ...
- L001-老男孩教育-Python13期VIP视频-19节-pbb
L001-老男孩教育-Python13期VIP视频-19节-pbb Windows上安装 Python3开发环境 下载:www.python.org >选择Downloads>All re ...
随机推荐
- 面向对象编程(OOP)、面向组件编程(COP)、面向方面编程(AOP)和面向服务编程(SOP)
http://blog.csdn.net/hjf19790118/article/details/6919265 1.什么是面向对象编程(Object-Oriented Programming)? 面 ...
- Docker 安装mysql8.0
1. 下载Mysql的Docker镜像: $ docker search mysql (搜索mysql镜像) $ docker pull mysql (下载mysql镜像,默认最新版本) 2. 运行镜 ...
- emmet工具使用和技巧
介绍 在前端开发的过程中,一大部分的工作是写 HTML.CSS 代码.特别是手动编写 HTML 代码的时候,效率会特别低下,因为需要敲打很多尖括号,而且很多标签都需要闭合标签等.于是,就有了 Emme ...
- Android学习笔记_69_android 支付宝之网页支付和快捷支付
参考资料: https://b.alipay.com/order/productDetail.htm?productId=2013080604609654 https://b.alipay.com/o ...
- Android学习笔记_30_常用控件使用
一.状态栏通知(Notification): 如果需要查看消息,可以拖动状态栏到屏幕下方即可查看消息.发送消息的代码如下: public void sendNotice(View v){ int ic ...
- Restframework介绍
1.REST介绍 REST与技术无关,它代表的是一种软件架构风格,全称Representational State Transfer,中文翻译为“表征状态转移” REST从资源的角度类审视整个网络,它 ...
- IOS 浅谈闭包block的使用
前言:对于ios初学者,block通常用于逆向传值,遍历等,会使用,但是可能心虚,会感觉block很神秘,那么下面就一起来揭开它的面纱吧. ps: 下面重点讲叙了闭包的概念,常用的语法,以及访问变量, ...
- 『ACM C++』PTA浙大 | 基础题 - 打印沙漏
<数据结构>开课前的一些小作业练习,可能因为一个寒假都没有打C++手生了,整个寒假都在帮拍电影做后期特效,导致这道题居然用了两个钟去AC,深感惭愧,作个标记吧,下面上题. 一首好曲推荐:同 ...
- 微信小程序navigator无法跳转情况
情况有三种 跳转的页面没有在app.json中注册 跳转的路径不正确 以上两种在命令行(console)中都会提示 跳转的页面在TabBar中,需要将open-type属性是设置为switchTab
- thinkphp5 分页带参数的解决办法
文档有说可以在paginate带参数,然后研究了下,大概就是这样的: $list=Db::name('member') ->where('member_name|member_mobile|se ...