英国知名大学java作业解析
大家好,我是今天的值班编辑,某母婴电商的高级java研发工程师。
今天给大家分享的是英国一所知名大学的java作业,用英文讲就是homework,简写为hw。
为什么小编要分享一些作业题目呢? 这可不是小编在偷懒。
因为俗话说得好,“外来的和尚会念经”,各位朋友无论是在校的学生,还是已经毕业工作多年的老司机,小编都觉得您应该来看看外来的和尚在做什么样子的java作业,然后和国内对比一下,找一找国内与国内的差距在什么地方。
第一题,mostCommonChar
翻译过来就是:
有一个class,它里面只有一个私有的string类型成员str。
需要开发一个public的方法mostCommonChar(),它可以返回str成员中最常出现的字母。
听起来应该挺简单的,就是一个计数题。
但是细节要求非常多:
1)不区分字母大小写,一律以小写字母来处理。
2)只针对 a-z A-Z 这种字母进行统计
3)如果2个或者多个字母出现次数相同,且同为最常出现的字母,则返回第一个在str中出现的字母。 这句话听起来有点绕,朋友们可以多读几遍。
4)如果str成员为null或者为空,或者不包含任何一个字母,则抛出一个异常NullPointerException。
5)举例:对于一个str "My lucky numbers are 5, 25, and 12.", mostCommonChar()方法返回的值为'm'
以小编多年来的工作编程经验,对于这种细节要求比较多的需求,先写单元测试是一个非常好的主意,也就是传说的中TDD(Test Driven Development,测试驱动开发)。
在这里,小编就不展示junit单测的代码了,咱们还是直接来看java源代码吧。
首先判断str长度是否为0, 如果为0就抛出异常;然后用一个int数组来给26个字母做计数器,并把每个字母的计数初始化为0:
然后遍历str中的每一个字母c,如果c为大写字母,则把它转成小写字母;然后在循环中判断c是否为小写字母,若是的话,则更新计数器,加1即可。这里有一个看起来比较晦涩的操作,就是把char c转成了int。
计数完成之后, 就开始做统计操作了。遍历一下26个计数器,从里面找出最大值。
然后再创建一个新的int数组cs,用于保存最常出现的字母(最大可能有26个),全部初始化为-1。
再遍历一次计数器数组,从里面找出计数为最大值的字母(可为多个),依次保存到cs中。
如果cs中只有一个有效字符(变量j的值为1),那么这个字母就是我们要找的最常出现的字符,直接返回即可。
如果cs中有多个有效字符的话,就得搞2个嵌套的for循环分别遍历str和cs数组了:
值得一提的是,第88行的if是一定会为true的,也就是在第89行这个函数就一定返回了。
那么,第95行的return其实是没有必要的,因为运行不到这里 。
不过,java的语法要求比较严格,一定得有个return在最后面,不然编译的时候就会报错了。
第二题,numberLengthsInSubstring()
上面的第一题,大家是不是觉得比较简单呢,如果觉得int数组作为计数器比较晦涩难以理解的话,也可以使用hashMap的哦,小编就不自己写hashMap的代码了。
下面来看第二题:
这道题翻译成中文就是:
还是这个class,它有一个私有的成员变量str,实现一个public方法numberLengthsInSubstring(),它接收两个参数,分别为起点和终点。
要求把str从起点参数开始到终点参数结束(闭区间,且第一个字符的起始点为1),从这段区间里面找出连续的数字,然后把这段连续数字替换为它的长度。
比如: str为"0460",起点为1,终点为4的时候,此函数运行之后, str变为"4"。 (当然不包含这个双引号了。因为0460长度为4,所以被替换为4)
再比如str为"326 abc 123",起点为1,终点为11的时候,此函数运行之后,str变为"3 abc 3"。 因为326长度为3,被替换为3, 123长度也为3,也被替换为3了。
另外还有2个特殊要求:
1)如果起点参数小于1, 或者起点参数大于终点参数时,抛出异常。
2)如果终点参数超出str的长度,则抛出另外一个异常。
这道题目看起来蛮简单,只要遍历一下str,找出连续的数字,顺便在遍历的时候记录一下连续数字的长度,最后用一个新的字符串来保存就可以。
其实,这道题的坑非常多,需要考虑的比较全面。小编感觉它很适合作为一道面试题。
首先做2个异常的判断,这2个if语句写得很直白了。 然后定义一个新的String,就叫做newStr吧。 之后开一个for循环,对str进行遍历。先跳过起点之前的字符,不需要任何处理,直接附加到newStr尾部。
如果遍历到了终点后面的字符,似乎也不需要任何处理,直接附加到newStr尾部就可以了。但是,这里其实是有坑的。如果终点处刚好也是一个数字,那么需要额外做一个附加操作,也就是163行的那个if语句。如果遍历到的字符c为数字的话(170行),只要计数就可以。如果遍历到的字符c非数字的话,且计数长度大于0,说明刚刚存在连续的数字,那么就需要做一个附加操作(174行的if语句),然后再把遍历到的字符c附加到newStr尾部。
千万不要以为这样就完了,下面是另外一个坑。
当遍历到了字符串结尾的时候,如果终点刚好位于str的结尾,那么仍然需要再做一次if判断 。
这2个坑,如果是思路不清晰的同学,面试的时候必挂,尤其是第二个坑。
人生就像弈棋,一步失误,全盘皆输,这是令人悲哀之事;而且人生还不如弈棋,不可能再来一局,也不能悔棋。
- 标签:
- 编辑:刘柳
- 相关文章