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

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

先不管猿圈网是干什么的,反正我觉得那是一个可以做题,可以敲代码的网站 😆 ,昨天意外发现了这个网站,在上面做了几道 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 回帖 • 161 关注
  • 算法
    437 引用 • 254 回帖 • 24 关注
  • 面试

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

    325 引用 • 1395 回帖 • 1 关注
  • Java

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

    3198 引用 • 8215 回帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 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
飘风不终朝,骤雨不终日。 北京

推荐标签 标签

  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 3 关注
  • SQLServer

    SQL Server 是由 [微软] 开发和推广的关系数据库管理系统(DBMS),它最初是由 微软、Sybase 和 Ashton-Tate 三家公司共同开发的,并于 1988 年推出了第一个 OS/2 版本。

    21 引用 • 31 回帖 • 1 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    31 引用 • 108 回帖
  • Unity

    Unity 是由 Unity Technologies 开发的一个让开发者可以轻松创建诸如 2D、3D 多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎。

    25 引用 • 7 回帖 • 131 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 440 关注
  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 3 关注
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    42 引用 • 130 回帖 • 247 关注
  • Google

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

    49 引用 • 192 回帖
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 759 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 677 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 401 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖 • 1 关注
  • flomo

    flomo 是新一代 「卡片笔记」 ,专注在碎片化时代,促进你的记录,帮你积累更多知识资产。

    6 引用 • 141 回帖 • 1 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    168 引用 • 597 回帖
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 82 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    58 引用 • 25 回帖
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 492 关注
  • 链滴

    链滴是一个记录生活的地方。

    记录生活,连接点滴

    173 引用 • 3849 回帖 • 1 关注
  • Vim

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

    29 引用 • 66 回帖
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 111 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    22 引用 • 214 回帖
  • sts
    2 引用 • 2 回帖 • 226 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 119 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    17 引用 • 53 回帖 • 146 关注