• 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html
  • 极客专栏正式上线!欢迎访问 https://www.jikewenku.com/topic.html

巨人网络的三道坑爹改错题

技术杂谈 勤劳的小蚂蚁 3个月前 (02-04) 56次浏览 已收录 0个评论 扫描二维码

读前须知:
  各位朋友,此篇文章只是本人测试的结果,我的知识和思维必定有限,因此,此篇文章还存在缺陷,如有不正确的地方请大家指出,我及时改正。

  各位看客、牛人,不要小看这几到题啊,来尝试一下找错误吧,小弟先附上自己的理解(当然是经过测试的),一起交流吧。

  看看你能中几枪……

巨人网络2013校园招聘Java程序员笔试题:
1、改错题(指出错误之处并对其进行修改)

1.1、下列代码的错误之处
publicclassQuestion1{
   /**
    * 判断是否为奇数
    * @param i
    * @return true 为奇数 false 为偶数
    */
   publicstaticbooleanisOdd(int i){
       return i%2==1;
   }
   /**
    * @param args
    */
   publicstaticvoidmain(String[] args){
       for(int i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++i){
           boolean isOdd=isOdd(i);
           System.out.println(String.format(“i=%d,isOdd=%b”, i, isOdd));
       }
   }
}

1.2、下列代码的错误之处
publicclassQuestion2{
   publicstaticvoidmain(String[] args){
       finallong MICROS_PER_DAY=24*60*60*1000*1000;
       finallong MILLIS_PER_DAY=24*60*60*1000;
       System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
   }

}


1.3、下列代码的错误之处
publicclassQuestion3 {
   publicstaticvoidmain(String[] args) {
       for(byte b=Byte.MIN_VALUE;b<Byte.MAX_VALUE;b++){
           if(b==0x90)
               System.out.println(“Joy!”);
       }
   }
}



1.1错误:
  • for语句是死循环; 
  • 判断int型是否为奇数return i%2==1错误,应该为:return i%2!=0;
  • Mysuny这位朋友提出判断是否为奇数用i&1最好,我表示赞成,return (i&1)==1;
测试代码1:
publicclassQuestion1Test2{
   /**
    * 判断是否为奇数
    * @param i
    * @return true 为奇数 false 为偶数
    */
   publicstaticbooleanisOdd(int i){
       return i%2==1;
   }
   /**
    * @param args
    */
   publicstaticvoidmain(String[] args)throws Exception {
       for(int i=Integer.MAX_VALUE-5;i<=Integer.MAX_VALUE;++i){
           boolean isOdd=isOdd(i);
           System.out.println(String.format(“i=%d,isOdd=%b”, i, isOdd));
           Thread.sleep(500);
       }
   }

}


结果:
i=2147483642,isOdd=false
i=2147483643,isOdd=true
i=2147483644,isOdd=false
i=2147483645,isOdd=true
i=2147483646,isOdd=false
i=2147483647,isOdd=true
i=-2147483648,isOdd=false
i=-2147483647,isOdd=false
i=-2147483646,isOdd=false  
//注意:这将引出此程序的第二个错误!

publicclassQuestion1Test3 {
   publicstaticvoidmain(String[] args) {
       System.out.println(“整数的最小值:”+Integer.MIN_VALUE);
       //    整数的最小值:-2147483648
       System.out.println(“整数的最大值:”+Integer.MAX_VALUE);
       //    整数的最大值:2147483647
       System.out.println(“Integer.MAX_VALUE+1:”+(Integer.MAX_VALUE+1));
       //    Integer.MAX_VALUE+1:-2147483648
   }
}

测试代码二:
publicclassQuestion1Test5{
   /**
    * 判断是否为奇数
    * @param i
    * @return true 为奇数 false 为偶数
    */
   publicstaticbooleanisOdd(int i){
       int j=i%2;
       System.out.println(“i%2=”+j);
       return j==1;
   }
   /**
    * @param args
    */
   publicstaticvoidmain(String[] args){
       for(int i=-10;i<=0;++i){
           boolean isOdd=isOdd(i);
           System.out.println(String.format(“i=%d,isOdd=%b”, i, isOdd));
       }
   }

}


运行结果:
i%2=0
i=-10,isOdd=false
i%2=-1
i=-9,isOdd=false
i%2=0
i=-8,isOdd=false
i%2=-1
i=-7,isOdd=false
i%2=0
i=-6,isOdd=false
i%2=-1
i=-5,isOdd=false
i%2=0
i=-4,isOdd=false
i%2=-1
i=-3,isOdd=false
i%2=0
i=-2,isOdd=false
i%2=-1
i=-1,isOdd=false
i%2=0
i=0,isOdd=false

通过测试二及其运行结果我们可以看到当为负int型的数据时,与2的余数为-1而不是1。

正确写法:
publicclassQuestion1Test4{
   /**
    * 判断是否为奇数
    * @param i
    * @return true 为奇数 false 为偶数
    */
   publicstaticbooleanisOdd(int i){
       return i%2 != 0;
   }
   /**
    * @param args
    */
   publicstaticvoidmain(String[] args){
       for(int i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++i){
           boolean isOdd=isOdd(i);
           System.out.println(String.format(“i=%d,isOdd=%b”, i, isOdd));
           if(i == Integer.MAX_VALUE)
               break;
       }
   }
}

1.2错误:int类型数值计算超出范围的问题
1.2的运行结果是:5,大家是不是感觉很奇怪啊,为什么不是1000呢?

测试程序1如下:
publicclassQuestion2Test {
   publicstaticvoidmain(String[] args) {
       int i = 24 * 60 * 60 * 1000 * 1000;
       long li = 24 * 60 * 60 * 1000 * 1000;
       long l = 24 * 60 * 60 * 1000 * 1000L;
       System.out.println(“i=” + i);
       //    i=500654080
       System.out.println(“li=” + li);
       //    li=500654080
       System.out.println(“l=” + l);
       //    l=86400000000
       System.out.println(Integer.MAX_VALUE);
       //    2147483647
   }

}


从测试结果我们可以看出:24*60*60*1000*1000 的结果明显超出了int类型的表达范围,在运算的过程中运算结果仍然为int型,超出范围就截取后64位作为运算的结果。因此,我们看到虽然定义了long型变量li,但结果仍然是截取后的结果。

测试程序1中仍然存在问题,我们在测试程序2中指出。

测试程序2如下:
publicclassQuestion2Test2 {
   publicstaticvoidmain(String[] args) {
       long l1 = 24*60*60*1000*1000*1000L;
       long l2 = 24L*60*60*1000*1000*1000;
       System.out.println(l1);
       //    500654080000
       System.out.println(l2);
       //    86400000000000
   }
}

我想大家都可以看懂我写测试程序2的用意,我就不在多说……

正确写法如下:
publicclassQuestion2Test3{
   publicstaticvoidmain(String[] args){
       finallong MICROS_PER_DAY=24L*60*60*1000*1000;
       finallong MILLIS_PER_DAY=24L*60*60*1000;
       System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
       //    1000
   }

}


1.3正确     (本人这么觉得)

测试程序1:
publicclassQuestion3Test1 {
   publicstaticvoidmain(String[] args) {
       System.out.println(“byte类型的最大值:”+Byte.MAX_VALUE);
       //    byte类型的最大值:127
       for(byte b=(byte)(Byte.MAX_VALUE-5);b<Byte.MAX_VALUE;b++){
           System.out.println(“b=”+b);
           if(b==0x90)
               System.out.println(“Joy!”);
       }
   }
}

运行结果:
b=122
b=123
b=124
b=125
b=126

由于1.3程序的for循环中 b<Byte.MAX_VALUE  而并不是 b<=Byte.MAX_VALUE ,所以没有出现1.1中的错误。

有人觉得0x90超出了byte类型的表示范围[-128,127],但是我并不觉得在这里是错误,因为题目也没有特殊要求。

丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:巨人网络的三道坑爹改错题
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

您必须 登录 才能发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ


QQ:2248886839


工作时间:09:00-23:00