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

一次笔试引发的血案

读前须知:

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

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

  看看你能中几枪。。。

  巨人网络2013校园招聘Java程序员笔试题:

1、改错题(指出错误之处并对其进行修改)

  1.1、下列代码的错误之处

  --

  --

 1 public class Question1 {
 2     /**
 3      * 判断是否为奇数
 4      * @param i
 5      * @return true 为奇数 false 为偶数
 6      */
 7     public static boolean isOdd(int i){
 8         return i%2==1;
 9     }
10     /**
11      * @param args
12      */
13     public static void main(String[] args) {
14         for(int i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++i){
15             boolean isOdd=isOdd(i);
16             System.out.println(String.format("i=%d,isOdd=%b", i, isOdd));
17         }
18     }
19 } 

  1.2、下列代码的错误之处

  --

  --

1 public class Question2 {
2     public static void main(String[] args) {
3         final long MICROS_PER_DAY=24*60*60*1000*1000;
4         final long MILLIS_PER_DAY=24*60*60*1000;
5         System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
6     }
7 }

  1.3、下列代码的错误之处

  --

  --

1 public class Question3 {
2     public static void main(String[] args) {
3         for(byte b=Byte.MIN_VALUE;b<Byte.MAX_VALUE;b++){
4             if(b==0x90)
5                 System.out.println("Joy!");
6         }
7     }
8 }

 


  1.1错误:

    1、for语句是死循环; 

    2、判断int型是否为奇数return i%2==1错误,应该为:return i%2!=0;

    3、Mysuny这位朋友提出判断是否为奇数用i&1最好,我表示赞成,return (i&1)==1;

  测试代码1:

 1 public class Question1Test2 {
 2     /**
 3      * 判断是否为奇数
 4      * @param i
 5      * @return true 为奇数 false 为偶数
 6      */
 7     public static boolean isOdd(int i){
 8         return i%2==1;
 9     }
10     /**
11      * @param args
12      */
13     public static void main(String[] args) throws Exception {
14         for(int i=Integer.MAX_VALUE-5;i<=Integer.MAX_VALUE;++i){
15             boolean isOdd=isOdd(i);
16             System.out.println(String.format("i=%d,isOdd=%b", i, isOdd));
17             Thread.sleep(500);
18         }
19     }
20 }

  结果:

1 i=2147483642,isOdd=false
2 i=2147483643,isOdd=true
3 i=2147483644,isOdd=false
4 i=2147483645,isOdd=true
5 i=2147483646,isOdd=false
6 i=2147483647,isOdd=true
7 i=-2147483648,isOdd=false
8 i=-2147483647,isOdd=false
9 i=-2147483646,isOdd=false   注意:这将引出此程序的第二个错误!
 1 public class Question1Test3 {
 2     public static void main(String[] args) {
 3         System.out.println("整数的最小值:"+Integer.MIN_VALUE);
 4         //    整数的最小值:-2147483648
 5         System.out.println("整数的最大值:"+Integer.MAX_VALUE);
 6         //    整数的最大值:2147483647
 7         System.out.println("Integer.MAX_VALUE+1:"+(Integer.MAX_VALUE+1));
 8         //    Integer.MAX_VALUE+1:-2147483648
 9     }
10 }

  测试代码二:

 1 public class Question1Test5 {
 2     /**
 3      * 判断是否为奇数
 4      * @param i
 5      * @return true 为奇数 false 为偶数
 6      */
 7     public static boolean isOdd(int i){
 8         int j=i%2;
 9         System.out.println("i%2="+j);
10         return j==1;
11     }
12     /**
13      * @param args
14      */
15     public static void main(String[] args) {
16         for(int i=-10;i<=0;++i){
17             boolean isOdd=isOdd(i);
18             System.out.println(String.format("i=%d,isOdd=%b", i, isOdd));
19         }
20     }
21 }

  运行结果:

 1 i%2=0
 2 i=-10,isOdd=false
 3 i%2=-1
 4 i=-9,isOdd=false
 5 i%2=0
 6 i=-8,isOdd=false
 7 i%2=-1
 8 i=-7,isOdd=false
 9 i%2=0
10 i=-6,isOdd=false
11 i%2=-1
12 i=-5,isOdd=false
13 i%2=0
14 i=-4,isOdd=false
15 i%2=-1
16 i=-3,isOdd=false
17 i%2=0
18 i=-2,isOdd=false
19 i%2=-1
20 i=-1,isOdd=false
21 i%2=0
22 i=0,isOdd=false

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

  正确写法:

 1 public class Question1Test4 {
 2     /**
 3      * 判断是否为奇数
 4      * @param i
 5      * @return true 为奇数 false 为偶数
 6      */
 7     public static boolean isOdd(int i){
 8         return i%2 != 0;
 9     }
10     /**
11      * @param args
12      */
13     public static void main(String[] args) {
14         for(int i=Integer.MIN_VALUE;i<=Integer.MAX_VALUE;++i){
15             boolean isOdd=isOdd(i);
16             System.out.println(String.format("i=%d,isOdd=%b", i, isOdd));
17             if(i == Integer.MAX_VALUE)
18                 break;
19         }
20     }
21 }

 

  1.2错误:int类型数值计算超出范围的问题

  1.2的运行结果是:5,大家是不是感觉很奇怪啊,为什么不是1000呢?

  测试程序1如下:

 1 public class Question2Test {
 2     public static void main(String[] args) {
 3         int i = 24 * 60 * 60 * 1000 * 1000;
 4         long li = 24 * 60 * 60 * 1000 * 1000;
 5         long l = 24 * 60 * 60 * 1000 * 1000L;
 6         System.out.println("i=" + i);
 7         //    i=500654080
 8         System.out.println("li=" + li);
 9         //    li=500654080
10         System.out.println("l=" + l);
11         //    l=86400000000
12         System.out.println(Integer.MAX_VALUE);
13         //    2147483647
14     }
15 }

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

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

  测试程序2如下:

 1 public class Question2Test2 {
 2     public static void main(String[] args) {
 3         long l1 = 24*60*60*1000*1000*1000L;
 4         long l2 = 24L*60*60*1000*1000*1000;
 5         System.out.println(l1);
 6         //    500654080000
 7         System.out.println(l2);
 8         //    86400000000000
 9     }
10 }

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

  正确写法如下:

1 public class Question2Test3 {
2     public static void main(String[] args) {
3         final long MICROS_PER_DAY=24L*60*60*1000*1000;
4         final long MILLIS_PER_DAY=24L*60*60*1000;
5         System.out.println(MICROS_PER_DAY/MILLIS_PER_DAY);
6         //    1000
7     }
8 }

  1.3正确     (本人这么觉得)

  测试程序1:

 1 public class Question3Test1 {
 2     public static void main(String[] args) {
 3         System.out.println("byte类型的最大值:"+Byte.MAX_VALUE);
 4         //    byte类型的最大值:127
 5         for(byte b=(byte)(Byte.MAX_VALUE-5);b<Byte.MAX_VALUE;b++){
 6             System.out.println("b="+b);
 7             if(b==0x90)
 8                 System.out.println("Joy!");
 9         }
10     }
11 }

  运行结果:

1 b=122
2 b=123
3 b=124
4 b=125
5 b=126

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

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

 

 

posted @ 2012-10-17 08:56  zero516cn  阅读(13046)  评论(71编辑  收藏  举报