問題#6:ITトレーニング-主要企業の現在の問題と課題

ITの大手企業でのインタビューで尋ねられる次のタスクの選択を公開する時が来ました。



KDPV



マイクロソフトで開発者の地位を申請者に求めることができるロジックに関するタスクと質問を選択しました。 タスクにはさまざまな難易度があります(たとえすべてが一見非常に単純に見える場合でも:)。



選択の目的は、回答を平凡に暗記するのではなく、論理的連鎖を解き、構築するための最適なアルゴリズムを見つけるためのトレーニングを通して、面接を成功させるために応募者を準備することです。



この目標を達成したことを願っています。



ご質問



  1. 池のアヒル

    キツネに追いかけられているアヒルは、半径rの円形の池の中心に座って自分自身を救います。 アヒルは陸から飛ぶことができますが、水から飛ぶことはできません。 さらに、キツネは泳ぐことができません。 キツネはアヒルの4倍の速さです。 アヒルとキツネが完全に賢いと仮定すると、アヒルが池の端に到達して地面から逃げるために飛び去ることは可能ですか?


    翻訳
    キツネに追いかけられたアヒルは、半径rの円形の池の中心で救助します。 アヒルは地面から離陸できますが、水から離陸することはできません。 キツネは泳ぐ方法を知りません。 また、キツネはアヒルよりも4倍高速です。 アヒルとキツネが完全に知的であると仮定すると、アヒルが海岸に到達して飛び去ることは可能ですか?

  2. フルーツクレート(およびラベル)

    あなたの前には3つの箱があります。 1つにはリンゴのみが含まれ、1つにはオレンジのみが含まれ、1つにはリンゴとオレンジの混合物が含まれます。 次のように、各ボックスには誤ったラベルが付けられています。

    ボックス1:「りんご」

    ボックス2:「オレンジ」

    ボックス3:「リンゴとオレンジ」



    質問:ボックスを1つだけ選択できます。 私はあなたの選んだ箱から無作為に選んだ果物を取り除き、それをあなたに見せます(だから、それがリンゴかオレンジかを知ることができます)。 その後、3つのボックスすべてを正確かつ明確に再ラベル付けできるようになります。



    翻訳
    前に3つの引き出し。 1つにはリンゴのみが含まれ、2番目にはオレンジのみが含まれ、3番目にはリンゴとオレンジが含まれます。 各ボックスには、次のような誤ってハングしたラベルがあります。

    ボックス1:りんご

    ボックス2:オレンジ

    ボックス3:「リンゴとオレンジ」



    質問:ボックスを1つだけ選択する必要があります。その後、選択したボックスから1つの果物を削除して表示します(リンゴかオレンジかを判断できるように)。 引き出しのラベルを正確に上回る必要があります。



タスク



  1. 乗算演算子なしで乗算する

    乗算演算を使用せずに、2つの整数を生成する関数を作成します。 できるだけ早くこれを行うようにしてください(O(log(n)またはそれ以上)



    翻訳
    乗算演算子を使用せずに2つの整数の積を返す関数を作成します。 最大のパフォーマンス(O(log(n)以上)で実装してみてください。

    また、乗算、除算、ループ、ビット演算子の演算子なしで乗算を実装する必要があるこの問題のバリエーションも見ました。

  2. N番目の素数

    n番目の素数を返す関数を作成します。 たとえば、nthPrime(1)は2が最初の素数であるため2を返し、nthPrime(2)は3を返す必要があります。


    翻訳
    n番目の素数を返す関数を作成します。 例:

    nthPrime(1)=> 2(2は最初の素数であるため)

    nthPrime(2)=> 3

    など

  3. 同じ番号の次の番号を見つける

    数値Nが与えられたら、nと同じ桁のセットを持ち、Nより大きい次の数値を見つけます。Nがその桁のセットで可能な最大の数値である場合、「できません」と出力します。

    例:

    N = "218765" => "251678"

    N = "1234" => "1243"

    N = "4321" => "不可能"

    N = "534976" => "536479"



    翻訳
    番号Nを指定すると、同じ数字のセットを持ち、Nより大きい次の番号を見つける必要があります。Nが可能な組み合わせの最大値である場合、「できません」と出力します。

    例:

    N = "218765" => "251678"

    N = "1234" => "1243"

    N = "4321" => "不可能"

    N = "534976" => "536479"



答えは、いつものように、来週以内に与えられます-決定する時間があります。 頑張って



解決策



  1. 質問1
    確かに、アヒルのための海岸への直線移動は有益ではありません。キツネは4倍高速であるため、出口点で早くなります:(π* r)<(4 * r)。



    アヒルは円で泳ぐことができ、円の半径が<r / 4である場合、この円はキツネよりも速く泳ぎます。いくつかの円では、キツネの前に立つことができ、それらの間が池の中心になります。 アヒルがr / 4-xの距離(xは無限に小さい値)で泳ぎ始めてから、出口点に到達するとします。

    -アヒル3 / 4r + xの場合

    -キツネ用π* r



    明らかに、π* r <4(3/4 r + x)であり、アヒルは飛び去ることができます。



  2. 質問2
    「リンゴ+オレンジ」というラベルの付いたボックスから1つのアイテムを選択する必要があります。

    プレートが間違っているので、このボックスにはリンゴのみまたはオレンジのみがあります。

    リンゴを手に入れたとしましょう。 このボックスの正しいラベルは「Apples」です。



    残りの2つの箱には、リンゴとオレンジのプレートがあり、その中にオレンジが入った1つの箱と混合物が入った1つの箱があります。

    タブレットは状態に応じて正しくないため、オレンジはリンゴの記号が付いた箱の中にあり、混合物はオレンジの記号が付いた箱の中にあります。

    彼らが最初の箱からオレンジを取った場合、解決策は同じになります。



  3. タスク1
    1つの解決策は再帰です。



    #include<stdio.h> /* function to multiply two numbers x and y*/ int multiply(int x, int y) { /* 0 multiplied with anything gives 0 */ if(y == 0) return 0; /* Add x one by one */ if(y > 0 ) return (x + multiply(x, y-1)); /* the case where y is negative */ if(y < 0 ) return -multiply(x, -y); } int main() { printf("\n %d", multiply(5, -11)); getchar(); return 0; }
          
          







  4. タスク2
    回答オプション:

     #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX 100000000 void prime(int n, int *primes) { int i,j,count=0; primes[count++] = 2; if (count == n) return; for(i=3;i<=MAX;i+=2) { int isPrime=1; int jMax = sqrt(i); for(j=3;j<=jMax;j+=2) { if(i%j==0) { isPrime=0; break; } } if(isPrime) { primes[count++] = i; if(count==n) return; } } } int main() { int n,i; scanf("%d",&n); int arr[n]; int maxPrime = 0; for(i=0;i<n;i++) { scanf("%d",&arr[i]); if (arr[i] > maxPrime) maxPrime = arr[i]; } int primes[maxPrime]; prime(maxPrime, primes); for (i=0;i<n;i++) { printf("%d\n", primes[arr[i]-1]); } return 0;
          
          







  5. タスク3
    元のソリューション:

     #include <iostream> #include <cstring> #include <algorithm> using namespace std; // Utility function to swap two digits void swap(char *a, char *b) { char temp = *a; *a = *b; *b = temp; } // Given a number as a char array number[], this function finds the // next greater number. It modifies the same array to store the result void findNext(char number[], int n) { int i, j; // I) Start from the right most digit and find the first digit that is // smaller than the digit next to it. for (i = n-1; i > 0; i--) if (number[i] > number[i-1]) break; // If no such digit is found, then all digits are in descending order // means there cannot be a greater number with same set of digits if (i==0) { cout << "Next number is not possible"; return; } // II) Find the smallest digit on right side of (i-1)'th digit that is // greater than number[i-1] int x = number[i-1], smallest = i; for (j = i+1; j < n; j++) if (number[j] > x && number[j] < number[smallest]) smallest = j; // III) Swap the above found smallest digit with number[i-1] swap(&number[smallest], &number[i-1]); // IV) Sort the digits after (i-1) in ascending order sort(number + i, number + n); cout << "Next number with same set of digits is " << number; return; } // Driver program to test above function int main() { char digits[] = "534976"; int n = strlen(digits); findNext(digits, n); return 0; }
          
          










All Articles