جاري التحميل...
جاري التحميل...
مجموعة متنوعة من المشاكل للاستعداد للمقابلات
تختبر المقابلات التقنية مهاراتك في حل المشكلات وقدرتك على البرمجة ومعرفتك بتصميم النظام.
💡 ما سنتعلمه:
تنسيقات المقابلة، أنواع الأسئلة الشائعة، استراتيجيات حل المشكلات، ونصائح التواصل.
تستخدم شركات مختلفة تنسيقات مقابلة مختلفة لتقييم المرشحين.
💡 التنسيقات:
البرمجة على السبورة، البرمجة المباشرة، المشاريع المنزلية، تصميم النظام، المقابلات السلوكية.
تتضمن المقابلات التقنية غالبًا هذه الفئات من الأسئلة.
💡 الأنواع:
هياكل البيانات، الخوارزميات، تصميم النظام، خصائص اللغة، إصلاح الأخطاء، مراجعة الكود.
اتبع نهجًا منهجيًا عند حل المشكلات في المقابلات.
💡 الاستراتيجية:
1. افهم المشكلة، 2. اطرح أسئلة توضيحية، 3. خطط لنهجك، 4. برمج الحل، 5. اختبره.
التواصل الواضح مهم بنفس قدر حل المشكلة بشكل صحيح.
💡 النصائح:
فكر بصوت عالٍ، اشرح نهجك، اطرح أسئلة، ناقش المفاضلات.
عند العطب، استخدم هذه الاستراتيجيات للمضي قدمًا.
💡 الاستراتيجيات:
فكك المشكلة، ابدأ بحل بسيط،حسّن خطوة بخطوة، ناقش البدائل.
اكتب دالة تطبع الأرقام من 1 إلى n. لكن إذا كان الرقم يقبل القسمة على 3 اطبع 'Fizz' بدلاً منه، وإذا كان يقبل القسمة على 5 اطبع 'Buzz'، وإذا كان يقبل القسمة على كليهما اطبع 'FizzBuzz'.
📋 أمثلة:
n = 5
["1","2","Fizz","4","Buzz"]
n = 15
["1","2","Fizz","4","Buzz","Fizz","7","8","Fizz","Buzz","11","Fizz","13","14","FizzBuzz"]
💡 تلميح:
function fizzBuzz(n) {
const result = [];
for (let i = 1; i <= n; i++) {
if (i % 15 === 0) result.push("FizzBuzz");
else if (i % 3 === 0) result.push("Fizz");
else if (i % 5 === 0) result.push("Buzz");
else result.push(i.toString());
}
return result;
}معطى سلسلة s تحتوي فقط على الأحرف '(', ')', '{', '}', '[' و ']', حدد ما إذا كانت السلسلة المدخلة صحيحة.
📋 أمثلة:
s = "()"
true
s = "()[]{}"true
s = "(]"
false
💡 تلميح:
function isValid(s) {
const stack = [];
const map = { ')': '(', ']': '[', '}': '{' };
for (const char of s) {
if (char === '(' || char === '[' || char === '{') {
stack.push(char);
} else {
if (stack.length === 0 || stack[stack.length - 1] !== map[char]) {
return false;
}
stack.pop();
}
}
return stack.length === 0;
}أعطى عدد صحيح x، أرجع true إذا كان x عدد صحيح palindrome. عدد palindrome يقرأ بنفس الطريقة من الأمام والخلف.
📋 أمثلة:
x = 121
true
x = -121
false
x = 10
false
💡 تلميح:
function isPalindrome(x) {
if (x < 0) return false;
if (x < 10) return true;
if (x % 10 === 0) return false;
let reversed = 0;
let original = x;
while (x > reversed) {
reversed = reversed * 10 + x % 10;
x = Math.floor(x / 10);
}
return x === reversed || x === Math.floor(reversed / 10);
}صمم هيكل بيانات LRU Cache. يجب أن يدعم الـ Cache العمليات التالية: get(key) - يجلب قيمة المفتاح من الـ Cache، وput(key, value) - يضيف أو يحدث المفتاح والقيمة. يجب أن يكون Time Complexity للعمليتين O(1).
📋 أمثلة:
LRUCache(2) put(1,1) put(2,2) get(1)\nput(3,3) get(2)
1 -1
LRUCache(1) put(2,1) get(2) put(3,2) get(2)
1 -1
💡 تلميح:
class LRUNode {
constructor(key, value) {
this.key = key;
this.value = value;
this.prev = null;
this.next = null;
}
}
class LRUCache {
constructor(capacity) {
this.capacity = capacity;
this.cache = new Map();
this.head = new LRUNode(0, 0);
this.tail = new LRUNode(0, 0);
this.head.next = this.tail;
this.tail.prev = this.head;
}
_remove(node) {
node.prev.next = node.next;
node.next.prev = node.prev;
}
_addFront(node) {
node.next = this.head.next;
node.prev = this.head;
this.head.next.prev = node;
this.head.next = node;
}
get(key) {
if (this.cache.has(key)) {
const node = this.cache.get(key);
this._remove(node);
this._addFront(node);
return node.value;
}
return -1;
}
put(key, value) {
if (this.cache.has(key)) {
this._remove(this.cache.get(key));
}
const node = new LRUNode(key, value);
this._addFront(node);
this.cache.set(key, node);
if (this.cache.size > this.capacity) {
const lru = this.tail.prev;
this._remove(lru);
this.cache.delete(lru.key);
}
}
}معطى مصفوفة من الفترات intervals حيث intervals[i] = [start, end]، ادمج جميع الفترات المتعارضة وأعد المصفوفة الناتجة.
📋 أمثلة:
intervals = [[1,3],[2,6],[8,10],[15,18]]
[[1,6],[8,10],[15,18]]
intervals = [[1,4],[4,5]]
[[1,5]]
💡 تلميح:
function merge(intervals) {
intervals.sort((a, b) => a[0] - b[0]);
const merged = [intervals[0]];
for (let i = 1; i < intervals.length; i++) {
const last = merged[merged.length - 1];
if (intervals[i][0] <= last[1]) {
last[1] = Math.max(last[1], intervals[i][1]);
} else {
merged.push(intervals[i]);
}
}
return merged;
}معطى مصفوفة nums، أرجع مصفوفة answer حيث answer[i] هو حاصل ضرب جميع عناصر nums ما عدا nums[i]. يجب أن يكون التعقيد الزمني O(n) وبدون استخدام القسمة.
📋 أمثلة:
nums = [1,2,3,4]
[24,12,8,6]
nums = [-1,1,0,-3,3]
[0,0,9,0,0]
💡 تلميح:
function productExceptSelf(nums) {
const n = nums.length;
const left = new Array(n).fill(1);
const right = new Array(n).fill(1);
for (let i = 1; i < n; i++) {
left[i] = left[i - 1] * nums[i - 1];
}
for (let i = n - 2; i >= 0; i--) {
right[i] = right[i + 1] * nums[i + 1];
}
const result = [];
for (let i = 0; i < n; i++) {
result.push(left[i] * right[i]);
}
return result;
}معطى مصفوفة أعداد nums تحتوي على n + 1 عدد صحيح حيث كل عدد في النطاق [1, n] بما في ذلك ذلك. يوجد رقم واحد مكرر فقط في nums، أرجع هذا الرقم المكرر.
📋 أمثلة:
nums = [1,3,4,2,2]
2
nums = [3,1,3,4,2]
3
💡 تلميح:
function findDuplicate(nums) {
let slow = nums[0];
let fast = nums[0];
while (true) {
slow = nums[slow];
fast = nums[nums[fast]];
if (slow === fast) break;
}
slow = nums[0];
while (slow !== fast) {
slow = nums[slow];
fast = nums[fast];
}
return slow;
}معطى مصفوفة ثنائية الأبعاد n x n، قم بدوران الصورة 90 درجة (عقارب الساعة). يجب أن تقوم بالدوران في المكان.
📋 أمثلة:
matrix = [[1,2,3],[4,5,6],[7,8,9]]
[[7,4,1],[8,5,2],[9,6,3]]
matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]
💡 تلميح:
function rotate(matrix) {
const n = matrix.length;
// Transpose the matrix
for (let i = 0; i < n; i++) {
for (let j = i; j < n; j++) {
[matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
}
}
// Reverse each row
for (let i = 0; i < n; i++) {
matrix[i].reverse();
}
}معطى مصفوفة m x n، أرجع جميع عناصر المصفوفة بترتيب حلزوني.
📋 أمثلة:
matrix = [[1,2,3],[4,5,6],[7,8,9]]
[1,2,3,6,9,8,7,4,5]
matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
[1,2,3,4,8,12,11,10,9,5,6,7]
💡 تلميح:
function spiralOrder(matrix) {
const result = [];
if (matrix.length === 0) return result;
let top = 0, bottom = matrix.length - 1;
let left = 0, right = matrix[0].length - 1;
while (top <= bottom && left <= right) {
for (let i = left; i <= right; i++) result.push(matrix[top][i]);
top++;
for (let i = top; i <= bottom; i++) result.push(matrix[i][right]);
right--;
if (top <= bottom) {
for (let i = right; i >= left; i--) result.push(matrix[bottom][i]);
bottom--;
}
if (left <= right) {
for (let i = bottom; i >= top; i--) result.push(matrix[i][left]);
left++;
}
}
return result;
}معطى مصفوفة أعداد nums، أنت موضع في الفهرس الأول. كل عنصر في المصفوفة يمثل أقصى طول قفزة يمكنك فعله من ذلك الموضع. أرجع true إذا كان بإمكانك الوصول إلى الفهرس الأخير، أو false بخلاف ذلك.
📋 أمثلة:
nums = [2,3,1,1,4]
true
nums = [3,2,1,0,4]
false
💡 تلميح:
function canJump(nums) {
let maxReach = 0;
for (let i = 0; i < nums.length; i++) {
if (i > maxReach) return false;
maxReach = Math.max(maxReach, i + nums[i]);
}
return true;
}معطى n عدد غير سالب يمثل خريطة ارتفاع حيث عرض كل عمود 1، احسب كم من الماء يمكن حبسه بعد المطر.
📋 أمثلة:
height = [0,1,0,2,1,0,1,3,2,1,2,1]
6
height = [4,2,0,3,2,5]
9
💡 تلميح:
function trap(height) {
let left = 0, right = height.length - 1;
let leftMax = 0, rightMax = 0;
let water = 0;
while (left < right) {
if (height[left] < height[right]) {
if (height[left] >= leftMax) {
leftMax = height[left];
} else {
water += leftMax - height[left];
}
left++;
} else {
if (height[right] >= rightMax) {
rightMax = height[right];
} else {
water += rightMax - height[right];
}
right--;
}
}
return water;
}تسلسل تحويل من كلمة beginWord إلى كلمة endWord باستخدام قاموس wordList هو تسلسل من الكلمات beginWord -> s1 -> s2 -> ... -> sk حيث كل زوج مجاور يختلف بحرف واحد فقط. أرجع عدد الكلمات في أقصر تسلسل تحويل، أو 0 إذا لم يوجد.
📋 أمثلة:
beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log","cog"]
5
beginWord = "hit", endWord = "cog", wordList = ["hot","dot","dog","lot","log"]
0
💡 تلميح:
function ladderLength(beginWord, endWord, wordList) {
const wordSet = new Set(wordList);
if (!wordSet.has(endWord)) return 0;
let queue = [[beginWord, 1]];
const visited = new Set([beginWord]);
while (queue.length > 0) {
const [word, level] = queue.shift();
for (let i = 0; i < word.length; i++) {
for (let c = 97; c <= 122; c++) {
const newWord = word.slice(0, i) + String.fromCharCode(c) + word.slice(i + 1);
if (newWord === endWord) return level + 1;
if (wordSet.has(newWord) && !visited.has(newWord)) {
visited.add(newWord);
queue.push([newWord, level + 1]);
}
}
}
}
return 0;
}معطى مصفوفة من فترات الاجتماعات intervals حيث intervals[i] = [start, end]، أرجع الحد الأدنى من قاعات الاجتماعات المطلوبة.
📋 أمثلة:
intervals = [[0,30],[5,10],[15,20]]
2
intervals = [[7,10],[2,4]]
1
💡 تلميح:
function minMeetingRooms(intervals) {
if (intervals.length === 0) return 0;
const starts = intervals.map(i => i[0]).sort((a, b) => a - b);
const ends = intervals.map(i => i[1]).sort((a, b) => a - b);
let rooms = 0;
let endPointer = 0;
for (let i = 0; i < starts.length; i++) {
if (starts[i] < ends[endPointer]) {
rooms++;
} else {
endPointer++;
}
}
return rooms;
}قبل المقابلة:
راجع الأساسيات
Data Structures, Big-O, Common Algorithms - تأكد من فهمك للمفاهيم الأساسية
تدرب بانتظام
حل 2-3 مسائل يومياً على LeetCode - ركز على Top Interview 150
simulated Mock Interviews
تدرب في ظروف المقابلة الحقيقية: متحدث بصوت عالٍ، حل تحت ضغط الوقت
أثناء المقابلة:
Clarify the Problem
اطرح أسئلة لتوضيح المتطلبات، الأمثلة الحدية، والقيود قبل الحل
ابدأ بـ Brute Force
اقترح حلاً بسيطاً أولاً ثم حسّنه - هذا يظهر تفكيرك المنهجي
تحدث بصوت عالٍ
اشرح تفكيرك أثناء الحل - المقابل يريد أن يرى كيف تفكر، ليس فقط النتيجة
أنماط التعرف على المسائل:
بحث في مصفوفة مرتبة
Two Pointers أو Binary Search
إيجاد عناصر فريدة أو عدّها
Hash Map أو Set
أقصر مسار في Graph
BFS (بدون أوزان) أو Dijkstra (مع أوزان)
مشاكل التحسين (Optimization)
Dynamic Programming أو Greedy