题目

* 随机生成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行代码)的更多相关文章

  1. 图解 Java IO : 二、FilenameFilter源码

    Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter   ...

  2. 500G JAVA视频网盘分享 (Jeecg社区)

    http://blog.csdn.net/zhangdaiscott/article/details/18220411    csdn 排名400多名 500 G JAVA视频网盘分享(Jeecg社区 ...

  3. Java 使用blob对H5视频播放进行加密《java视频加密》

    1.创建一个H5 <video>标签 <video id="sound" type="video/mp4" controls="co ...

  4. 500 G JAVA视频网盘分享(JEECG开源社区)

    500 G JAVA视频网盘分享(JEECG开源社区)   [涵盖从java入门到深入架构,Linux.云计算.分布式.大数据Hadoop.ios.Android.互联网技术应有尽有]   [转载:h ...

  5. 500G JAVA视频网盘分享 (JEECG开源社区)

    500 G JAVA视频网盘分享(JEECG开源社区)   [涵盖从java入门到深入架构,Linux.云计算.分布式.大数据Hadoop.ios.Android.互联网技术应有尽有]       J ...

  6. JAVA视频网盘分享

    JAVA视频网盘分享 [涵盖从java入门到深入架构,Linux.云计算.分布式.大数据Hadoop.ios.Android.互联网技术应有尽有] 1.JavaScript视频教程 链接: http: ...

  7. Android零基础入门第36节:Android系统事件的响应

    原文:Android零基础入门第36节:Android系统事件的响应 在开发Android应用时,有时候可能需要让应用程序随系统设置而进行调整,比如判断系统的屏幕方向.判断系统方向的方向导航设备等.除 ...

  8. 死磕 java同步系列之ReentrantLock源码解析(二)——条件锁

    问题 (1)条件锁是什么? (2)条件锁适用于什么场景? (3)条件锁的await()是在其它线程signal()的时候唤醒的吗? 简介 条件锁,是指在获取锁之后发现当前业务场景自己无法处理,而需要等 ...

  9. L001-老男孩教育-Python13期VIP视频-19节-pbb

    L001-老男孩教育-Python13期VIP视频-19节-pbb Windows上安装 Python3开发环境 下载:www.python.org >选择Downloads>All re ...

随机推荐

  1. [ZJOI2012]小蓝的好友

    https://www.luogu.org/problemnew/show/P2611 题解 \(n\times m\)肯定过不去.. 我们把给定的点看做障碍点,考虑先补集转化为求全空矩阵. 然后我们 ...

  2. 2018.11.30 zsh: command not found: mysql 的解决办法mac环境下

    系统环境变量的问题.解决办法: 1.打开终端.输入open .zshrc 会出现一个可编辑文档, 2.找到# User configuration部分,在下一行添加source ~/.bash_pro ...

  3. 【洛谷P3388】(模板)割点

    [模板]割点 割点集合:一个顶点集合V,删除该集合的所有定点以及与这些顶点相连的边后,原图不连通,就称集合V为割点集合 点连通度:最小割点集合中的顶点数 边连通度:最小割边集合中的边数 割点:割点集合 ...

  4. Android学习笔记_42_各种图形的炫酷效果的实现和使用

    一.文档位置: 这里在android中的图形,在帮助文档的这个页面,  android-sdk-windows\docs\guide\topics\resources\drawable-resourc ...

  5. 旧文备份:硬盘MBR引导记录损坏的一种修复方法

    硬盘MBR信息损坏原因:硬盘上安装了windows XP和linux双系统,在windows下安装一套软件,破解的时候修改了硬盘的序列号,结果导致引导系统的grub无法完成linux的引导,只能进到w ...

  6. Python—XML

    什么是xml XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 XML 标签没有被 ...

  7. c语言描述的数据结构的注意细节

    :顺序表使用基址来表示和存储 int *p; p=(int *)malloc(initsize*sizeof(int)); L—>p[x]=xx; :链表 在于除了更改数据还要更改前后与之关联的 ...

  8. java流汇总以及使用实例

    流一.基本概念 Java中对文件的操作是以流的方式进行的.流是Java内存中的一组有序数据序列.Java将数据从源(文件.内存.键盘.网络) 读入到内存中,形成了流,然后将这些流还可以写到另外的目的地 ...

  9. SQL on&where&having

    on.where.having这三个都可以加条件的子句中,on是最先执行,where次之,having最后.有时候如果这先后顺序不影响中间结果的话,那最终结果是相同的.但因为on是先把不符合条件的记录 ...

  10. %ROWTYPE在INSERT和UPDATE语句里的妙用

    PL/SQL里的ROWTYPE类型具有非常大的用处和灵活性,现在发现ROWTYPE在insert和update语句里的妙用,可以节省很多代码,特别是在行copy和更新的时候. 在INSERT语句中: ...