猿圈网的几个 Java 挑战题评测题分享

本贴最后更新于 2606 天前,其中的信息可能已经时移世异

先不管猿圈网是干什么的,反正我觉得那是一个可以做题,可以敲代码的网站 😆 ,昨天意外发现了这个网站,在上面做了几道 Java 的题,总感觉哪里做的不太对劲,分享出来相互交流一下,帮忙看看我做的到底哪块是不对的。

相关说明:

代码中从注释 //No.1 开始到注释 //end_code 结束是需要自己写代码实现功能的地方,除此部分之外的代码基本都是试题给定的代码。

1. 插入排序

用 java 代码实现插入排序

import java.util.Arrays; // 自己导入 public class InsertSortTest { public static void main(String[] args) { int[] array = { 49, 38, 65, 97, 76, 13, 27, 14, 10 }; //No.1 //开始写代码,用java实现插入排序 if (array == null || array.length == 0) { //判断数组不存在或为空 return; } int i, j, tmp; int len = array.length; for (i = 1; i < len; i++) { // 从 1 开始遍历 array j = i; tmp = array[i]; while (j > 0 && tmp < array[j - 1]) { // 如果 array[i] < array[i - 1] array[j] = array[j - 1]; // array[i] = array[i - 1] j--; } array[j] = tmp; // array[i - 1] = array[i] } System.out.println(Arrays.toString(array)); //end_code } }
### 2. ip 转化为整数 > #### `使用 java 代码实现将 IPV4 的 IP 地址转化为对应整数并输出,比如 192.168.199.1 对应整数为 3232286465` > > ``` java > public class IpToNumber { > public static void main(String[] args) { > IpToNumber ipToNumber = new IpToNumber(); > System.out.println("IPV4的IP地址对应的整数为 : " + ipToNumber.ipToLong("192.168.199.1")); > } > > public long ipToLong(String ipAddress) { > long result = 0; > String[] ipAddressInArray; > > //No.1 > //开始写代码,将IPV4的IP地址转化为相对应的整数 > ipAddressInArray = ipAddress.split("\\."); // 将 ip 截为 4 个部分字符串 > long[] ipLong = new long[4]; > for (int i = 0; i < ipAddressInArray.length; i++) { > ipLong[i] = Long.parseLong(ipAddressInArray[i]); // 分别转为 long 型后存入 ipLong 中 > } > result = (ipLong[0] << 24) + (ipLong[1] << 16) + (ipLong[2] << 8) + ipLong[3]; // 进行位移操作 > //end_code > return result; > } > } > ``` ### 3. 找重复数字和未出现数字 > #### `假设 0-10000 数字中有 2 个数字相同,还有 1 个数字没有出现,仅遍历一次数组找出重复数和未出现的数字。` > > ``` java > public class FindNumberTest { > public static void main(String[] args) { > int number[] = new int[10001]; > int numCopy[] = new int[10001]; // 这个变量我没有用到...不知道是用来干嘛的 > int repeat = 0, notAppear = 0; > int sumNumber = 0; > int i; > > for (i = 0; i < 10001; i++) {//数组初始化 > number[i] = i; > } > number[573] = 5236;//设定重复数字5236出现两次,573不出现 > > //No.1 > //开始写代码,仅遍历一次数组找出重复数和未出现的数字。 > for (int j = 0; j < number.length; j++) { > if(j != number[j] && number[j] == number[sumNumber]) { // 因为数组 number[0] = 0, number[1] = 1... 所以这算不算是投机取巧 :joy: > repeat = number[j]; > notAppear = j; > } > sumNumber++; > } > //end_code > System.out.println("重复数字:"+repeat + " 未出现数字:" + notAppear); > } > } > ``` ### 4. 约瑟夫环问题 > #### `用 java 代码实现约瑟夫环问题,50 个人围成一圈报数,报到 3 的倍数的离开,求最后剩下的那个人原来站的位置` > ``` java > // 在主方法中调用 > public static void YueSeFuLoop() { > LinkedList linkedlist = new LinkedList(); > //No.1 > //开始写代码,有50人围成一圈报数,报到3的倍数的人离开,求最后剩下的人原来站在第几位,实现removeFromList方法 > for (int i = 1; i <= 50; i++) { > linkedlist.add(i); > } > int index = 0; > while(linkedlist.size() > 0) { // 最后一个人离开之前 > for (int i = 0; i < (3 - 1); i++) { // 如果不是 3 的倍数 > int num = linkedlist.remove(0); // 移除不是 3 的倍数的数,第一次开始为 1 > linkedlist.add(num); // 将不是 3 的倍数的数放在最后,第一次开始是把 1 放在 50 之后 > } > // 未进入 for 循环,说明是 3 的倍数,则从列表中移除 > index = linkedlist.remove(0); > System.out.println("end : " + linkedlist.size() + " \t index: " + index); > } > // while 循环执行完毕,最后一个人已被移除 > System.out.println(index); // 最后一个人开始所站的位置 11 > } > ``` ### 5. 阿姆斯特朗数问题 > #### `例如 153=1^3+5^3+3^3 的数叫做 Armstrong 数,用 java 代码实现输出三位数的 Armstrong 数` > ``` java // 同样还是在主方法里调用 :grin: > public static void armstrongTest() { > int hundredsDigit,tensDigit,unitsDigit;//hundredsDigit表示数字的百位,tensDigit表示数字的十位,unitsDigit表示数字的个位 > System.out.println("寻找Armstrong数:"); > for (int i = 100; i <= 999; i++) { > //No.1 > //开始写代码,例如153可以满足1^3 + 5^3 + 3^3 = 153,这样的数称为Armstrong数,输出所有三位数中的Armstrong数 > hundredsDigit = i / 100; // 获取百位数 > tensDigit = (i % 100) / 10; // 十位数 > unitsDigit = i % 10; // 个位数 > // Math.pow(double a, double b) 返回 a 的 b 次方 > if ((Math.pow(hundredsDigit, 3) + Math.pow(tensDigit, 3) + Math.pow(unitsDigit, 3)) == i) // 如果是Armstrong数则输出 > System.out.print(i + " "); > //end_code > } > System.out.println(); > } > ``` ### 6. 统计指定类型字符个数 > #### `用 java 代码实现输入一串字符串,统计其中的数字、英文、空格、其他字符个数` > ``` java public static void strLength() { int digital = 0;//数字个数 int character = 0;//英文个数 int other = 0;//其他字符个数 int blank = 0;//空格个数 char[] chars = null; System.out.println("这是任意一串字符:"); String string = "djfiepqo ioghr4 8758495 7123hr37hfjW$@@$@^%!"; chars = string.toCharArray(); //No.1 //开始写代码,计算任意一串字符中的数字个数、英文字母个数、空格个数和其他字符个数 for (int i = 0; i < chars.length; i++) { if(chars[i] >= '0' && chars[i] <= '9') { // 数字 digital++; } else if((chars[i] >= 'a' && chars[i] <='z') || (chars[i] >= 'A' && chars[i] <='Z')) { // 英文字母 character++; } else if(chars[i] == ' ') { // 空格 blank++; } else { // 其他字符 other++; } } //end_code System.out.println("数字个数: " + digital); System.out.println("英文字母个数: " + character); System.out.println("空格个数: " + blank); System.out.println("其他字符个数:" + other); } > ``` ### 7. 用递归方法计算一个数的阶乘 > #### `给定一个正整数,Java 实现用递归的方法计算它的阶乘` > ``` java > public class Test { > public static void main(String[] args) { > int number = 12; > Recursion factorialRecursion = new Recursion(); > System.out.println(number + "! = " + factorialRecursion.recursion(number)); > } > } > //No.1 > //开始写代码,给定一个正整数,用递归的方法计算它的阶乘.main函数已给出,实现Recursion类 > class Recursion { > public int recursion(int number) { > if(number < 0) { > System.out.println("请输入0或正整数!"); > return 0; > } else if(number == 1 || number == 0) { > return 1; > } else { > return number * recursion(number - 1); > } > } > } > //end_code > ``` > > 艾玛呀,一不小心又到凌晨了....
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1063 引用 • 3455 回帖 • 166 关注
  • 算法
    428 引用 • 254 回帖 • 24 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    325 引用 • 1395 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3194 引用 • 8214 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • iTanken via macOS

    @88250 也还没睡呢,看来还不晚 😂 😂

    1 回复
  • 睡觉睡觉

    1 回复
  • iTanken via macOS

    嗯,该睡了、

  • someone

    这第 4 题:用 java 代码实现约瑟夫环问题,50 个人围成一圈报数,报到 3 的倍数的离开,求最后剩下的那个人原来站的位置。
    你的答案没看懂
    你的这个 for 循环判断不是 3 的倍数 for (int i = 0; i < (3 - 1); i++) { // 如果不是 3 的倍数。 它怎么判断的?
    另外 int num = linkedlist.remove(0); // 移除不是 3 的倍数的数,第一次开始为 1 。 linkedlist.remove(int index); 这个方法的返回值是泛型 E,你怎么能不强转直接等于呢?
    然后你的这个算法也没看懂。。。然后我就跟这道题杠上了,,
    花了一个中午的时间拿笔画画写写算算,算是写出来了,下面是我的方案:

  • someone

    import java.util.LinkedList;
    import java.util.List;

    public class Test {

    public static void main(String[] args) { int sum = 50;//设置总人数为 50 int num = 3; //设置 3 的倍数的人离开 getIndex(sum,num); }

    }

  • someone

    public static void getIndex(int sum,int num){ //sum 为总人数 num 为倍数

    List<Integer> list = new LinkedList<Integer>(); for(int i = 1;i <= sum;i++){ list.add(i); } int i = 0; for(int n = 1;n < sum;n++){ i = (i + num - 1) % list.size() list.remove(i); } System.out.println("最后剩下的是第 " + list.get(0) + " 个人"); } <i class='ft-small'>by 花是花生的生</i>
  • someone

    //创建一个集合 list, List
    //把所有人放进去, for(int i = 1;i <= sum;i++)
    //设置将离开的人的下标 int i = 0;
    //退出的人在集合中的下标 i, 因为 list 下标从 0 开始,所以需要 num-1
    //将集合中该人的元素删除

    为什么评论最大只能 200。。。。我几行的代码还得拆分成 3 次发表。。。
    不过我运行出来得结果 50 和 3 传进去得出也是 11 号,跟你结果一致
    很想了解一下你得这种算法,

  • someone
    1. 把不是 3 的倍数的数从第一个位置移除,放在最后一个位置,那第一个数就是 3 的倍数,跳出循环后将第一个数(即为 3 的倍数的数)移除;
    2. 泛型的限制对于不同的 JDK 版本有所不同,泛型只在编译阶段起作用,你反编译 class 文件看看。
  • liweiwei

    挺有意思的。

  • liweiwei

    那个第 3 题,我觉得楼主的答案中 if 判断条件中的 “&& number[j] == number[sumNumber]” 和 “sumNumber++” 是多余的,
    照你的写法,sumNumber 这个变量好像也用不着。
    楼主看是不是?

  • someone

    也是哈,当初做完直接就发出来了 😂 ,不过我总觉得我这种做法是有问题的
    哈哈哈

  • someone

    ─=≡Σ(((つ•̀ω•́)つ 这块皮肤做的真不错

  • someone

    谢谢😜

请输入回帖内容 ...
iTanken
飘风不终朝,骤雨不终日。 北京

推荐标签 标签

  • Bootstrap

    Bootstrap 是 Twitter 推出的一个用于前端开发的开源工具包。它由 Twitter 的设计师 Mark Otto 和 Jacob Thornton 合作开发,是一个 CSS / HTML 框架。

    18 引用 • 33 回帖 • 658 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    8 引用 • 26 回帖
  • Vim

    Vim 是类 UNIX 系统文本编辑器 Vi 的加强版本,加入了更多特性来帮助编辑源代码。Vim 的部分增强功能包括文件比较(vimdiff)、语法高亮、全面的帮助系统、本地脚本(Vimscript)和便于选择的可视化模式。

    29 引用 • 66 回帖 • 1 关注
  • 正则表达式

    正则表达式(Regular Expression)使用单个字符串来描述、匹配一系列遵循某个句法规则的字符串。

    31 引用 • 94 回帖
  • 程序员

    程序员是从事程序开发、程序维护的专业人员。

    585 引用 • 3538 回帖 • 1 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    21 引用 • 245 回帖 • 234 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 462 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    23 引用 • 32 回帖
  • 自由行
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    84 引用 • 324 回帖 • 1 关注
  • gRpc
    11 引用 • 9 回帖 • 89 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 353 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    289 引用 • 4492 回帖 • 655 关注
  • Chrome

    Chrome 又称 Google 浏览器,是一个由谷歌公司开发的网页浏览器。该浏览器是基于其他开源软件所编写,包括 WebKit,目标是提升稳定性、速度和安全性,并创造出简单且有效率的使用者界面。

    62 引用 • 289 回帖 • 1 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 417 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 633 关注
  • SMTP

    SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。

    4 引用 • 18 回帖 • 636 关注
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 652 关注
  • 七牛云

    七牛云是国内领先的企业级公有云服务商,致力于打造以数据为核心的场景化 PaaS 服务。围绕富媒体场景,七牛先后推出了对象存储,融合 CDN 加速,数据通用处理,内容反垃圾服务,以及直播云服务等。

    28 引用 • 226 回帖 • 139 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    549 引用 • 674 回帖
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 45 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    210 引用 • 2040 回帖
  • 招聘

    哪里都缺人,哪里都不缺人。

    189 引用 • 1057 回帖
  • 知乎

    知乎是网络问答社区,连接各行各业的用户。用户分享着彼此的知识、经验和见解,为中文互联网源源不断地提供多种多样的信息。

    10 引用 • 66 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    239 引用 • 224 回帖