最も面接が難しいIT企業のThoughtWorksコードチャレンジ——FizzBuzzzWhizzゲーム


最近、インターネット求人プラットフォームの勾引網はメーデーの間に「最も面接しにくいIT会社」のコード挑戦活動を発表し、5つの最も面接しにくいIT会社、すなわちThoughtWorks、Google、Unisys、Rackspace、Cypress Semiconductorを選出した.各会社は共同でチェックネットを引いてコードの挑戦を出して、すべての挑戦に対してすべて私达の自分のコードを提出することができて、もしコードのテストに合格すれば、后数日関连する会社の笔记试験、面接の招待を受け取って、これらは多くなくて、兴味のあるのは公式サイトに行って见ることができます.これらの問題は簡単で簡単ではありません.つまり、非常に簡単に見えますが、完璧にするのは難しいです.これはなぜ面接が難しいのか、あなたにあげる問題は非常に簡単です.あなたは自分が書いたのが正しいと思っていますが、最終的にはブラシされています.わけがわからないようで、あなたのコードが漏れています.
 
たとえばThoughtWorksが発表した最初のコードの課題は次のとおりです.

  
  
  
  

, , 。 100 。 :

1. , , 3、5、7。 2. , 。

3. , (3) , , Fizz; (5) , Buzz; (7) , Whizz。
4.  , , , , , FizzBuzz,  。 , FizzBuzzWhizz。 5.  , , , , 3, 13 Fizz。 , 3 4, 35 Fizz, BuzzWhizz。
 
, , 3 , 100 。 ,
 
3,5,7
( )
1 2 Fizz 4 Buzz Fizz Whizz 8 Fizz Buzz 11 Fizz
Fizz Whizz FizzBuzz 16 17 Fizz 19 Buzz  …
100

 
ええと、とても簡単な出力問題のように見えますが、重要なアルゴリズムには触れていません.みんなの思考が緻密で、菜鳥として、私もこの中にどんな罠やテクニックが含まれているのか分かりません.
私の一般的な考え方は(多くがこの考えだと信じています):
1.入力について2つの要件を満たす必要があります.
  • の3つの数はいずれも桁数であり、ここでも0(0は桁数ではないのか?)が含まれているかどうかは言っていません.また、この3つの桁数は必ずしも素数(素数)ではありませんので、倍数を判断する際は注意してください.3つの数の積を直接余すことはできません.
  • の3つの数は互いに異なる必要があります.

  • 2.报数条件については、まず条件5を判断し、次に条件4を判断し、4の中にも逆を判断し、同時に3つの特殊数の倍数であるかどうかを判断し、最后に条件3を判断し、いずれも直接その数字を出力しないようにしなければならない.流れは以下の通りである(现在数がnであると仮定し、3つの数はそれぞれnum 1、num 2、num 3):
  • nにnum 1が含まれている場合は「Fizz」を直接出力します.ここでは、整数が1つの数字を含むかどうかをプログラムで判断するのもチェックポイントかもしれません.Javaで書いたので、簡単にするためにnをStringに直接変換してindexOfで判断します.
  • nがnum 1,num 2,num 3の倍数であれば「FizzBuzzWhizz」、num 1,num 2の倍数であれば「FizzBuzz」、num 2,num 3の倍数であれば「BuzzWhizz」、num 1,num 3の倍数であれば「FizzzWhizz」を出力します.そうでなければ、単一num 1またはnum 2またはnum 3の倍数であるか否かを判断し、そうであれば対応する文字列を出力する.
  • 上記が満たされていない場合は、nを直接出力すればよい.

  • このような考え方でプログラムを書くのは非常に簡単で、以下のようにします(これは反例で、多くの人が書くコードで、ThoughtWorks社が最も見たくないコードだと信じています):
    import java.util.Scanner;
    
    public class FizzBuzzWhizz {
    
        /**
         * @brief FizzBuzzWhizz game.
         */
        public static void main(String[] args) {
    
            Scanner in = new Scanner(System.in);
            int num1 = in.nextInt();
            int num2 = in.nextInt();
            int num3 = in.nextInt();
    
            while (num1 <= 0 || num1 >= 10 || num2 <= 0 || num2 >= 10 
                    || num3 <= 0 || num3 >= 10 || num1 == num2 || num2 == num3
                    || num1 == num3) {
                System.out.println("These three digits must be between 1 and 9 and also" +
                        "be different with each other, please input again.");
                num1 = in.nextInt();
                num2 = in.nextInt();
                num3 = in.nextInt();
            }
            
            for(int n = 1; n <= 100; n++) {
                if(String.valueOf(n).indexOf(num1 + 48) != -1)
                    System.out.println("Fizz");
                else if(n % num1 == 0 && n % num2 == 0 && n % num3 == 0)
                    System.out.println("FizzBuzzWhizz");
                else if(n % num1 == 0 && n % num2 == 0 )
                    System.out.println("FizzBuzz");
                else if(n % num2 == 0 && n % num3 == 0)
                    System.out.println("BuzzWhizz");
                else if(n % num1 == 0 && n % num3 == 0)
                    System.out.println("FizzWhizz");
                else if(n % num1 == 0)
                    System.out.println("Fizz");
                else if(n % num2 == 0)
                    System.out.println("Buzz");
                else if(n % num3 == 0)
                    System.out.println("Whizz");
                else
                    System.out.println(n);
            }
        }
    }

     
    もちろん一つではありません.JAvaファイルを提出すればいいです.厳格性を体現するために、環境説明、実行説明、ユニットテストなどを書く必要があります.ユニットテストは重要で、どのようなテスト例を書くことができても、あなたの思考の緻密性を反映することができます.例えば、ここには少なくとも以下のいくつかのテスト例が含まれています.
  • 入力に負数があり、0があり、10より大きい数があり、等しい数があります.この場合の処理はすべての再入力なのか、条件に合わない再入力なのか、私がここで選んだのはすべての再入力です.
  • 入力はすべて素数で、すべて合数で、一部の素数の部分合数で、あなたが誤解していないことを体現しています.

  •  
    これは私も多くの人の頭の中の考えかもしれませんが、もちろんテーマ自体はこんなに簡単ではありません.私が考えていないところがたくさんあるに違いありません.ここでは反例を提供しています.
    みんなはまず私のコードをののしったり、これらの会社が出したこれらの問題をののしったりしないでください.きっと彼ら自身の道理があるに違いありません.牛がこのような需要に対して10行未満のコードを書いて複雑度が最も低いのを見たら、私たちはもともと彼らが望んでいたのがこのようなコードであることを知っているかもしれません.
    自分の貴重な意見とより良いコードや考えを提出して、これらの大企業が私たちに何を試験したいのかを検討することを歓迎します.
     
    ------------------------------------------------------------------
    更新:ありがとうございます@mringgはもっと簡潔なコードを提供して、需要によって、完全に順番に私のようにする必要はありません.以下の判断がもっといいです.
    for(int n = 1; n <= 100; n++) {
        flag = true;
        if(String.valueOf(n).indexOf(num1 + 48) != -1) {
            System.out.println("Fizz");
            continue;
        }
        if(n % num1 == 0) {
            System.out.print("Fizz");
            flag = false;
        }
        if(n % num2 == 0) {
            System.out.print("Buzz");
            flag = false;
        }
        if(n % num3 == 0) {
            System.out.print("Whizz");
            flag = false;
        }
        
        if(flag)
            System.out.print(n);
        System.out.println();
    }