巨人のネットの3つの穴のお父さんは間違った問題を直します

25418 ワード

一回の筆記試験による血事件
読む前の注意事項:
各位の友达、この文章はただ私のテストの结果で、私の知识と思惟はきっと有限で、そのため、この文章はまだ欠陥が存在して、もし正しくない地方があればみんなに指摘してもらって、私は直ちに改正します.
皆さん、お客さん、牛人さん、これらの問題を軽視しないでください.間違いを探してみてください.弟はまず自分の理解を添付して(もちろんテストを受けた)、一緒に交流しましょう.
何発撃てるか見てみろ...
巨人ネット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 }

テストコード2:
 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

テスト2とその実行結果から,負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ループでb0 x 90はbyteタイプの表示範囲を超えていると思う人もいますが[-128127]私はここで間違いだとは思いません.テーマにも特別な要求はありませんから.