1 题目重述

题目描述: 选出幸运手机号

解释: 从传入的若干个手机号码中,选中 n 个幸运手机号,并返回 n 个幸运手机号的号码。

例如:

  • 输入:“133”,“131”,“153”,“180”,“177”,“130”,“181”
  • 输入: n =3
  • 返回:幸运手机号码

2 题目分析

2.1 题目梳理

哈喽,各位小伙伴,你在抽奖的时候有没有对它产生的幸运号码抱有大大的问号,今天就和我一起来看看这背后的原理吧!不过这道题目时一个简单的实现哦,但是掌握了这个思路,就可以在此基础上进行复杂的加工啦。

好了,我们一起来看今天的题目吧!

题目关键字: 输入若干手机号码、选中幸运手机号码的个数 n 。

幸运体现在什么地方呢?就是随机性,若干个号码中随机的几个号码,那不就是幸运号码了吗?想想老师上课随机提问,被抽到的小伙伴是不是所谓的“天选之子”呢?

输入若干手机号码以及幸运号码的个数,说得简单一点,就是输入一个字符串以及一个整数。采用 Scanner 类的 nextInt() 方法和 Scanner 类的 next() 方法就可以获取到我们需要的信息了。

但是我们知道在字符串中,我们并不容易拿出一个电话号码的字符串,于是,我们可以先对输入的字符串按指定元素进行切割,切割后的字符串保存在字符串数组中,于是我们可以根据随机数的下标拿出相应的字符串。

电话号码的数组已经准备好了,我们开始思考如何保证随机性呢,是不是需要有一个随机数呢?我们怎么在计算机上获取随机数字呢?Java 为我们提供了这样的一个方法,我们可以创建 Random 类的对象 input ,调用 nextInt() 方法,传入参数n,即可为我们产生一个大于0,小于 n 的随机整数。

随机数产生了,但是因为数字的随机性,我们同样无法保证它会不会产生两个相同的随机数,如果随机数相同,难道我们要有两个一摸一样的幸运号码吗?这显然是不可能的,于是,我们需要加以判断。如果这个随即下标的对应元素已经被选中了,就不可以进行二次选择。那么我们可以将选中的元素先保存起来,再将其赋值为 null【空】,这样一来,我们就可以保证随机选中的元素不会重复。

另外,保存后的元素在一个数组中,无法直接输出,我们需要采用 Arrays 类的 toString() 方法将一维数组转换成字符串后进行输出。

2.2 实现思路

2.2.1 输入

采用 Scanner 类的 nextInt() 方法,获取一个整数 n 。
采用 Scanner 类的 next() 方法,获取一个字符串 str 。

2.2.2 截取

采用 String 类的 split( ) 方法,对字符串按照指定元素进行切割。

2.2.3 产生随机数下标

采用 Random 类 nextInt() 方法,传入参数n,即可产生一个大于0,小于 n 的随机整数。

2.2.4 判断产生幸运手机号码的下标是否已经存在

我们需要判断产生幸运手机号码的下标是否已经存在,如果存在,则此随即下标失效,需要重新产生。我们将已经存在的手机号码赋值为 null,检查随机下标对应的手机号是否为null,既可以判断幸运手机号码的下标是否已经存在。

如果为null ,代表该电话号码已经存在,需要重新产生随机下标,同时,该元素的下标不能直接递增,需要先自减后再自增,如此一来,下表没有变化,仍然保存在幸运手机号的数组的同一位置。最重要的是 我们需要退出当前循环,同时开始下一次循环,因此,我们需要采用 continue 关键字,作用是:跳出本次循环并直接进入下一次循环/

如果产生幸运手机号码的下标对应的元素没有存在,我们就将这个号码保存至幸运手机号的数组,接着令这个下标对应的元素为 null ,代表该元素已经存在,避免后续重复添加该手机号码。

2.2.5 输出

采用 Arrays 类的 toString() 方法将一维数组转换成字符串后进行输出。

3 代码实现

3.1 实现方式

3.1.1 代码语句:

 public static void main(String[] args) {// 1. 获取手机号码和幸运手机号码数量Scanner input = new Scanner(System.in);// 1.1 获取手机号码System.out.println("请输入参加活动的手机号码:");String phoneStr = input.next();// 1.2 获取幸运手机号码的数量System.out.println("请输入产生幸运手机号码的数量:");int n = input.nextInt();// 1.3 对获取手机号码按照指定格式进行切割String[] phone = phoneStr.split(",");// 2. 检查幸运手机号码的数量是否超出已有手机号码的数组长度// 2.1 已有手机号码的数组长度int len = phone.length;// 2.2 若超出,则返回 提示信息if (n > len) {System.out.println("产生幸运手机号码的数量输入错误!");System.out.println("请重新输入!");}// 3. 产生幸运手机号码// 3.1 产生幸运手机号码数组String[] luckPhone = new String[n];// 3.2 产生随机数的Random类的对象randRandom rand = new Random();for (int i = 0; i < n; i++) {// 3.3 随机产生幸运手机号码的下标int index = rand.nextInt(len);// 3.4 判断产生幸运手机号码的下标对应的元素是否为 null// 目的:检查该下标对应的手机号是否为null,如果为null重新产生随机下标if (phone[index] == null) {// 若是,则下标递减,代表该位置的元素重新生成i--;// 跳出本次循环直接进入下一次循环continue;}// 若不为 null ,则将该下标对应的元素赋值给幸运手机号的数组luckPhone[i] = phone[index];// 令该下标对应元素为 null// 目的:避免重复phone[index] = null;}// 4.输出幸运手机号码System.out.println("参加游戏的手机号码有:" + phoneStr);System.out.println("产生的幸运手机号码为:" + Arrays.toString(luckPhone));}

3.1.2 代码结果:

请输入参加活动的手机号码:
133,131,153,180,177,130,181
请输入产生幸运手机号码的数量:
3
参加游戏的手机号码有:133,131,153,180,177,130,181
产生的幸运手机号码为:[131, 177, 153]
请输入参加活动的手机号码:
133,131,153,180,177,130,181
请输入产生幸运手机号码的数量:
10
产生幸运手机号码的数量输入错误!
请重新输入!

3.2 实现方式

如果你不想在产生幸运手机号码时,每次都写这么多行代码,你也可以在第一次写的时候,就将产生随机号码的的代码,写成一个方法,下次用到的时候直接调用就可以啦。

3.2.1 代码语句:

 public static void main(String[] args) {// 1. 获取手机号码和幸运手机号码数量Scanner input = new Scanner(System.in);// 1.1 获取手机号码System.out.println("请输入参加活动的手机号码:");String phoneStr = input.next();// 1.2 获取幸运手机号码的数量System.out.println("请输入产生幸运手机号码的数量:");int n = input.nextInt();// 1.3 对获取手机号码按照指定格式进行切割String[] phone = phoneStr.split(",");// 2. 调用方法String[] luckPhone = luck(n, phone);// 3. 输出幸运手机号码System.out.println("参加游戏的手机号码有:" + phoneStr);System.out.println("产生的幸运手机号码为:" + Arrays.toString(luckPhone));}// 从传入的若干个手机号码中,选中n个幸运手机号,并返回public static String[] luck(int n, String[] phone) {int len = phone.length;// 1. 检查幸运手机号吗数量是否超出数组长度if (n > len) {return null;}// 2. 产生幸运手机号码数组String[] luckPhone = new String[n];// 3. 产生随机数的Random类的对象randRandom rand = new Random();// 4. 产生幸运手机号码for (int i = 0; i < n; i++) {// 4.1 产生一个随机下标int index = rand.nextInt(len);// 4.2 检查该下标 中手机号是否为null,如果为null重新产生随机下标if (phone[index] == null) {i--;continue;// 退出本次循环,继续执行下一次循环}luckPhone[i] = phone[index];phone[index] = null;// 赋值为null}return luckPhone;}

3.2.2 代码结果:

请输入参加活动的手机号码:
133,131,153,180,177,130,181
请输入产生幸运手机号码的数量:
3
参加游戏的手机号码有:133,131,153,180,177,130,181
产生的幸运手机号码为:[133, 181, 180]
请输入参加活动的手机号码:
133,131,153,180,177,130,181
请输入产生幸运手机号码的数量:
10
参加游戏的手机号码有:133,131,153,180,177,130,181
产生的幸运手机号码为:null

【Java每日编程小练习 2021-01-21】 幸运手机号的简单产生相关推荐

  1. java编写输出20个数_【Java每日编程小练习 2021-01-20】

    1 题目重述 题目描述: 字符串压缩 解释: 将原字符串中连续出现的字符,按照出现次数进行压缩处理. 例如: 输入:AACBBBDDDDDFFX 输出:A2C1B3D5F2X1 输入:AACCCDKK ...

  2. Java 并发编程小册整理好了

    Java 有并发,并发知识之大,一口吃不下 这曾是我不愿意触碰的知识角 多次一头扎进并发,无功而返 为应对面试,临时苦苦记忆,不成体系 这一次我决定从基础开始,攻克它 12,0000 字 68Mb 高 ...

  3. Java的编程小习惯——空格

    我们在用Java编程编程时要注意合理使用空格,在以下几种情况下我们建议使用空格,这样不仅会增加代码的美观,也可以让别人看起来比较方便 (1)在大括号之前加空格 (2)在小括号里加空格 (3)在等号,大 ...

  4. Java基础编程小案例-买飞机票

    买飞机票 需求: 机票价格按照淡季旺季.头等舱和经济舱收费.输入机票原价.月份和头等舱或经济舱. 机票最终优惠价格的计算方案如下:旺季(5-10月)头等舱9折,经济舱8.5折,淡季(11月到来年4月) ...

  5. 《惢客创业日记》2021.01.21(周四)什么是产品逻辑?

    今天晚上,正准备睡觉,看到凉粉儿给我发了一条消息,似乎是一句自问自答的哲学问题.她说:"我理解的惢客是惢客的价值吗?"我马上回答了一句话:"我觉得是这样,价值和产品逻辑是 ...

  6. 编程小题目之01:从键盘输入一数字a,求S=a+aa+aaa+aaaa+aa...a的值,例如:a=2,S=2+22; a=4,S=4+44+444+4444

    题目: 从键盘输入一数字a,求S=a+aa+aaa+aaaa+aa...a的值,例如:a=2,S=2+22; a=4,S=4+44+444+4444. public class Day06exer { ...

  7. java 模拟停车_Java多线程编程小实例模拟停车场系统

    下面分享的是一个Java多线程模拟停车场系统的小实例(Java的应用还是很广泛的,哈哈),具体代码如下: Park类 public class Park { boolean []park=new bo ...

  8. Java 函数式编程和 lambda 表达式

    为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...

  9. Java并发编程(08):Executor线程池框架

    本文源码:GitHub·点这里 || GitEE·点这里 一.Executor框架简介 1.基础简介 Executor系统中,将线程任务提交和任务执行进行了解耦的设计,Executor有各种功能强大的 ...

最新文章

  1. SpringSession(redis)
  2. channelinboundhandler中都包含了哪一类的方法_备考CMA考试有哪些方法技巧?
  3. python代码翻译-用python实现百度翻译的示例代码
  4. CVPR 2018 MCCT:《Multi-Cue Correlation Filters for Roubust Visual Tracking》论文笔记
  5. kbengine定义实体
  6. 自定义MongoDB的Spring Social Connect框架
  7. [JavaScript] 正则表达式
  8. idea for循环快捷键_IDEA骚技巧,编码速度至少快一倍
  9. 一个XML Schema及XML文档(联系人)
  10. 【2021-01-14】navicat使用ssh tunnel、密钥方式连接数据库的问题。错误:Unable to load key - unrecognised cipher name
  11. -函数-MATLAB提供的函数/主子函数/匿名-嵌套函数
  12. aov建立Java模拟,JAVA
  13. Oracle所有分析函数
  14. CAE软件技术现状调研
  15. MDM移动设备管理概述
  16. ei拼音的四个声调对应的字_幼儿园学前班拼音教案复习ei以及四声调
  17. GROMOS拓扑(、坐标、轨迹、能量)相关文件解读手册第5章阅读笔记II
  18. Allegro PCB的5种形状Symbol类型
  19. 字符串问题归类--C和C++
  20. sap采购申请自动转采购订单

热门文章

  1. 【C数据结构】单链表的实现以及链表和顺序表的优缺点
  2. 【珍藏版】 2012Java开发工程师必备精品资料(115个)
  3. 20年的嵌入式经验:如何从零开始开发一款嵌入式产品(值得收藏的高质量文章!)...
  4. 电脑PC端利用android-sdk使用微信、360云盘等应用
  5. Spark中repartition和coalesce的用法
  6. 近期微信登录10005报错,解决办法
  7. dell自带的测试软件,自带校色仪!戴尔万元显示器上手:告诉你什么叫专业
  8. 微信企业号用户验证php,身份验证
  9. 电磁场与仿真软件(36)
  10. 使用cv2.VideoCapture()函数捕获笔记本内置摄像头的拍摄画面