يتضمن الإصدار الجديد من التدريب على تكنولوجيا المعلومات مهام من "العملاق الأزرق" IBM.

في هذه الشركة ، مع ماض تاريخي غني ، قاموا أيضًا بتعيين مهام منطقية في المقابلات. البعض منهم ، الأكثر إثارة للاهتمام في رأينا ، أدرجنا في الاختيار. في ظل الخفض ، تنتظرك مهام المتقدمين ، كالمعتاد - ليس فقط بسيطًا ، بل يتطلب أيضًا التفكير.
الأسئلة
- الدجاج
قام مزارع ببيع بعض الدجاج لأربعة عملاء مختلفين في يوم معين. كان ذلك أن كل عميل اشترى نصف الدجاج المتبقي ونصف دجاجة أخرى.
هل يمكنك معرفة عدد الدواجن التي تم بيعها من قبل المزارع في ذلك اليوم إذا أخبرناك أن العميل الرابع اشترى دجاجة واحدة؟
الترجمةفي يوم واحد ، باع المزارع عدة دجاجات لأربعة مشترين. اتضح أن كل واحد منهم اشترى نصف الدجاج المتبقي ونصف فيلم آخر.
هل يمكنك إخباري بعدد الدجاج الذي تم بيعه في ذلك اليوم ، إذا كان من المعروف أن المشتري الرابع اشترى دجاجة كاملة؟
- الرصاص و المسدس
رجل عصابات روسي يختطفك. يضع رميتين متتاليتين في مسدس فارغ من ست جولات ، يدورها ، يوجهها إلى رأسك ويطلق النار. * انقر * أنت ما زلت على قيد الحياة. ثم يسألك ، "هل تريد مني أن أدورها مرة أخرى وأطلق النار أو اسحب الزناد مرة أخرى على الفور؟" لكل خيار ، ما هو احتمال أن يتم إطلاق النار عليك؟
الترجمةلقد تم اختطافك من قبل قطاع طرق روسي ( أوه ، هذه الصور النمطية! ). قام بإدخال 2 رصاصة بالتسلسل في مسدس من ست طلقات ، ودحرج الأسطوانة ، صوب رأسك وسحب الزناد. * اضغط *. أنت ما زلت على قيد الحياة. سألتك قاطعة الطريق - "هل تريد مني التمرير مرة أخرى والتصوير أو التصوير على الفور؟" ما هو احتمال إطلاق النار في كل حالة؟
المهام
- فرز مكدس باستخدام العودية
بالنظر إلى المكدس ، فإن المهمة هي فرزها باستخدام العودية. استخدام أي بنيات حلقة مثل حين ، ل .. الخ غير مسموح. يمكننا فقط استخدام وظائف ADT التالية على Stack S:
is_empty (S): اختبار ما إذا كان المكدس فارغًا أم لا.
push (S): إضافة عنصر جديد إلى المكدس.
pop (S): إزالة العنصر العلوي من المكدس.
top (S): إرجاع قيمة العنصر العلوي. لاحظ أن هذه الوظيفة لا تزيل العنصر من المكدس.
مثال:
الإدخال: -3 <- Top
14
18
-5
30
الإخراج: 30 <- أعلى
18
14
-3
-5
الترجمةبالنظر إلى المكدس ، فإن المهمة هي فرزها باستخدام العودية. يحظر استخدام التركيبات الدورية ، مثل حين ، لـ ... ، وما إلى ذلك. يُسمح فقط بأوامر التجريد التالية على مكدس S:
is_empty (S): للتحقق مما إذا كان المكدس فارغًا.
push (S): إضافة عنصر جديد إلى المكدس.
pop (S): إزالة العنصر العلوي من المكدس.
top (S): إرجاع قيمة العنصر العلوي. يرجى ملاحظة أن العنصر لم يتم حذفه في نفس الوقت.
أمثلة:
الإدخال: -3 <- أعلى المكدس
14
18
-5
30
الإخراج: 30 <- أعلى المكدس
18
14
-3
-5
مجزئ الكلماتبالنظر إلى سلسلة الإدخال وقاموس الكلمات ، اكتشف ما إذا كان يمكن تقسيم سلسلة الإدخال إلى تسلسل مفصول بمسافة من كلمات القاموس. راجع الأمثلة التالية لمزيد من التفاصيل.
تأمل القاموس التالي
{i ، مثل ، sam ، sung ، samsung ، mobile ، ice ،
كريم ، آيس كريم ، رجل ، اذهب ، مانجو}
الإدخال: ilike
الإخراج: نعم
يمكن تقسيم السلسلة على أنها "أحب".
الإدخال: ilikesamsung
الإخراج: نعم
يمكن تقسيم السلسلة كـ "i like samsung"
أو "أحب سام سونغ".
الترجمةإعطاء سلسلة إدخال وقاموس. اكتب برنامجًا لمعرفة ما إذا كان يمكن تقسيم السلسلة إلى سلسلة من الكلمات من القاموس. أمثلة:
تم إعطاء القاموس التالي:
{i ، مثل ، sam ، sung ، samsung ، mobile ، ice ،
كريم ، آيس كريم ، رجل ، اذهب ، مانجو}
الصف: ilike
خروج: نعم. يمكن تقسيم السلسلة إلى "أحب".
السلسلة: ilikesamsung
الإخراج: نعم. يمكن تقسيم السلسلة إلى "i like samsung" أو "i like sam sung".
برج التراص البلاطالبرج المستقر للارتفاع n عبارة عن برج يتكون من n بلاطات بالضبط من ارتفاع الوحدة مكدسة رأسيًا بهذه الطريقة ، بحيث لا يتم وضع بلاطة أكبر على بلاطة أصغر. يتم عرض مثال أدناه:
[1]
[2]
[3]
[4]
لدينا عدد لا نهائي من البلاط بأحجام 1 ، 2 ، ... ، م. المهمة هي حساب عدد الأبراج المستقرة المختلفة للارتفاع n التي يمكن بناؤها من هذه البلاطات ، مع تقييد يمكنك استخدامه كحد أقصى من البلاط في كل حجم في البرج.
ملاحظة: يختلف برجان من الارتفاع n إذا وفقط إذا كان هناك ارتفاع h (1 <= h <= n) ، بحيث يكون للأبراج بلاط بأحجام مختلفة عند الارتفاع h.
أمثلة:
الإدخال: ن = 3 ، م = 3 ، ك = 1.
الإخراج: 1
التسلسلات المحتملة: {1 ، 2 ، 3}.
وبالتالي فإن الإجابة هي 1.
المدخلات: ن = 3 ، م = 3 ، ك = 2.
الإخراج: 7
{1 ، 1 ، 2} ، {1 ، 1 ، 3} ، {1 ، 2 ، 2} ، {1 ، 2 ، 3} ، {1 ، 3 ، 3} ، {2 ، 2 ، 3} ، {2 ، 3 ، 3}.
الترجمةالبرج الثابت للارتفاع n هو برج يتكون من بلاطات n بالضبط بنفس الارتفاع ، مكدسة رأسيًا بحيث لا يقع البلاط الأكبر على البلاط الأصغر. مثال:
[1]
[2]
[3]
[4]
لدينا عدد لا نهائي من البلاط بأحجام 1 ، 2 ، ... ، م. تتمثل المهمة في حساب عدد الأبراج المستقرة المحتملة للارتفاع n التي يمكن بناؤها من هذه البلاطات ، مع الأخذ في الاعتبار أنه لا يمكنك استخدام أكثر من k بلاطات من كل حجم في البرج.
يرجى ملاحظة: يختلف برجان من الارتفاع n فقط إذا كان هناك ارتفاع مثل h (1 <= h <= n) بحيث يكون للأبراج بلاط بأحجام مختلفة عند ارتفاع h.
أمثلة:
الإدخال: ن = 3 ، م = 3 ، ك = 1.
الإخراج: 1
التسلسل المحتمل: {1 ، 2 ، 3}. الجواب 1.
المدخلات: ن = 3 ، م = 3 ، ك = 2.
الإخراج: 7
{1 ، 1 ، 2} ، {1 ، 1 ، 3} ، {1 ، 2 ، 2} ، {1 ، 2 ، 3} ، {1 ، 3 ، 3} ، {2 ، 2 ، 3} ، {2 ، 3 ، 3}.
سيتم تقديم الإجابات في غضون الأسبوع القادم - لديك وقت لاتخاذ القرار. حظ موفق
الحلول
السؤال 1الجواب: 15.
هنا شرحوا لماذا.
السؤال 2في
التعليقات أجاب على هذا السؤال بشكل صحيح
احتمالية وجود خرطوشة في الفتحة التالية من البرميل - 1/4
إذا قمت بتمرير الأسطوانة ، فإن احتمال توقفها على الخرطوشة هو 2/6 = 1/3
المهمة 1خيار الحل ، البرمجة الديناميكية:
#include <iostream> #include <string.h> using namespace std; /* A utility function to check whether a word is present in dictionary or not. An array of strings is used for dictionary. Using array of strings for dictionary is definitely not a good idea. We have used for simplicity of the program*/ int dictionaryContains(string word) { string dictionary[] = {"mobile","samsung","sam","sung","man","mango", "icecream","and","go","i","like","ice","cream"}; int size = sizeof(dictionary)/sizeof(dictionary[0]); for (int i = 0; i < size; i++) if (dictionary[i].compare(word) == 0) return true; return false; } // Returns true if string can be segmented into space separated // words, otherwise returns false bool wordBreak(string str) { int size = str.size(); if (size == 0) return true; // Create the DP table to store results of subroblems. The value wb[i] // will be true if str[0..i-1] can be segmented into dictionary words, // otherwise false. bool wb[size+1]; memset(wb, 0, sizeof(wb)); // Initialize all values as false. for (int i=1; i<=size; i++) { // if wb[i] is false, then check if current prefix can make it true. // Current prefix is "str.substr(0, i)" if (wb[i] == false && dictionaryContains( str.substr(0, i) )) wb[i] = true; // wb[i] is true, then check for all substrings starting from // (i+1)th character and store their results. if (wb[i] == true) { // If we reached the last prefix if (i == size) return true; for (int j = i+1; j <= size; j++) { // Update wb[j] if it is false and can be updated // Note the parameter passed to dictionaryContains() is // substring starting from index 'i' and length 'ji' if (wb[j] == false && dictionaryContains( str.substr(i, ji) )) wb[j] = true; // If we reached the last character if (j == size && wb[j] == true) return true; } } } /* Uncomment these lines to print DP table "wb[]" for (int i = 1; i <= size; i++) cout << " " << wb[i]; */ // If we have tried all prefixes and none of them worked return false; } // Driver program to test above functions int main() { wordBreak("ilikesamsung")? cout <<"Yesn": cout << "Non"; wordBreak("iiiiiiii")? cout <<"Yesn": cout << "Non"; wordBreak("")? cout <<"Yesn": cout << "Non"; wordBreak("ilikelikeimangoiii")? cout <<"Yesn": cout << "Non"; wordBreak("samsungandmango")? cout <<"Yesn": cout << "Non"; wordBreak("samsungandmangok")? cout <<"Yesn": cout << "Non"; return 0; }
المهمة 2الحل في جافا:
import java.util.ListIterator; import java.util.Stack; class Test {
المهمة 3خيار الحل:
#include <bits/stdc++.h> using namespace std; #define N 100 int possibleWays(int n, int m, int k) { int dp[N][N]; int presum[N][N]; memset(dp, 0, sizeof dp); memset(presum, 0, sizeof presum); // Initialing 0th row to 0. for (int i = 1; i < n + 1; i++) { dp[0][i] = 0; presum[0][i] = 1; } // Initialing 0th column to 0. for (int i = 0; i < m + 1; i++) presum[i][0] = dp[i][0] = 1; // For each row from 1 to m for (int i = 1; i < m + 1; i++) { // For each column from 1 to n. for (int j = 1; j < n + 1; j++) { // Initialing dp[i][j] to presum of (i - 1, j). dp[i][j] = presum[i - 1][j]; if (j > k) { dp[i][j] -= presum[i - 1][j - k - 1]; } } // Calculating presum for each i, 1 <= i <= n. for (int j = 1; j < n + 1; j++) presum[i][j] = dp[i][j] + presum[i][j - 1]; } return dp[m][n]; } // Driver Program int main() { int n = 3, m = 3, k = 2; cout << possibleWays(n, m, k) << endl; return 0; }