۩ کتاب آموزشی در حال تایپ ✎ دست‌گرمی مصاحبه‌های پایتونی | علی برادر خدام خسروشاهی

دست‌گرمی مصاحبه‌های پایتونی | علی برادر خدام خسروشاهی

علی برادر خدام خسروشاهی

دبیر + نویسنده + دل‌نگار
دبیر
نویسنده راشای
دل‌نگار راشای
"دست‌گرمی مصاحبه‌های پایتونی: راهنمای جامع مصاحبه‌ها"
مدرس و نویسنده: علی برادر خدام خسروشاهی

این کتاب یک مرجع کامل برای کسانی است که می‌خواهند در مصاحبه‌های استخدامی با پایتون موفق شوند. در این کتاب، شما با مجموعه‌ای از مسائل چالشی و کاربردی پایتون آشنا خواهید شد که در بیشتر مصاحبه‌های شغلی مطرح می‌شوند. هدف اصلی این کتاب این است که به شما کمک کند تا با یادگیری و حل مسائل الگوریتمی و داده‌ساختارها، مهارت‌های خود را برای مصاحبه‌ها تقویت کنید.


کتاب شامل مسائل مختلف از مفاهیم ابتدایی تا چالش‌های پیچیده‌تر است که به شما می‌آموزد چگونه مشکلات واقعی را با استفاده از پایتون حل کنید. در طول کتاب، تکنیک‌های مختلفی برای بهینه‌سازی کد و مدیریت پیچیدگی‌های الگوریتم‌ها معرفی خواهد شد. با حل این مسائل، شما آمادگی بیشتری برای مواجهه با سوالات پیچیده در مصاحبه‌های پایتون خواهید داشت.


این کتاب مناسب افرادی است که می‌خواهند در دنیای استخدام به عنوان یک توسعه‌دهنده پایتون موفق شوند، اعم از تازه‌کارها تا افراد با تجربه. تمرکز ویژه این کتاب روی الگوریتم‌ها، داده‌ساختارها و مسائل مهمی است که در مصاحبه‌های استخدامی پایتون ممکن است با آن‌ها روبرو شوید.
 
« انجمن رمان نویسی / دانلود رمان / تک رمان / انجمن تک رمان / انجمن راشای »

حل سوال استخدامی پایتون برنامه نویسی قسمت اول با علی برادر خدام خسروشاهی​

LeetCode 75

1768. Merge Strings Alternately

You are given two strings word1 and word2. Merge the strings by adding letters in alternating order, starting with word1. If a string is longer than the other, append the additional letters onto the end of the merged string.

Return the merged string.

Example 1:

Input: word1 = abc, word2 = pqr
Output: apbqcr
Explanation: The merged string will be merged as so:
word1: a b c
word2: p q r
merged: a p b q c r
Example 2:

Input: word1 = ab, word2 = pqrs
Output: apbqrs
Explanation: Notice that as word2 is longer, &quotrs&quot is appended to the end.
word1: a b
word2: p q r s
merged: a p b q r s
Example 3:

Input: word1 = abcd, word2 = pq
Output: apbqcd
Explanation: Notice that as word1 is longer, &quotcd&quot is appended to the end.
word1: a b c d
word2: p q
merged: a p b q c d
Constraints:
  • 1 <= word1.length, word2.length <= 100​
  • word1 and word2 consist of lowercase English letters.​
برای حل این مسئله، باید دو رشته رو به صورت یکیدرمیون ترکیب کنیم. یعنی از هر رشته یک کاراکتر برداریم و به نتیجه اضافه کنیم. اگر یکی از رشتهها زودتر تموم شد، بقیهی کاراکترهای رشتهی دیگه رو همونطور که هست به انتهای نتیجه اضافه میکنیم.

چطور الگوریتمش رو بفهمیم؟​

بیایم قدمبهقدم فکر کنیم:

  1. شروع از اول دو رشته: دو اشارهگر (index) روی اولین حرفهای دو رشته قرار میدیم.
  2. یکیدرمیون اضافه کردن: هر بار یکی از word1 و یکی از word2 رو به خروجی اضافه میکنیم.
  3. رسیدن به انتهای یکی از رشته ها: وقتی یکی از رشتهها تموم شد، باید بقیهی رشتهی دیگه رو بدون تغییر اضافه کنیم.

چطور اینو به کد تبدیل کنیم؟​

حالا که الگوریتم رو فهمیدیم، بیایم تبدیلش کنیم به کد پایتون:

  • از یک for استفاده میکنیم که به تعداد کوتاهترین رشته اجرا بشه.
  • یه result که توش کاراکترها رو ذخیره میکنیم.
  • بعد از تموم شدن for، بقیهی رشتهی بلندتر رو اضافه میکنیم.

کد:
Python:
def mergeAlternately(word1, word2):

result = []

min_length = min(len(word1), len(word2))

# یکی‌درمیون حروف رو اضافه کن

for i in range(min_length):

result.append(word1[i])

result.append(word2[i])

# اگر یکی از رشته‌ها طولانی‌تره، ادامه‌ش رو اضافه کن

result.append(word1[min_length:])

result.append(word2[min_length:])

return "".join(result)

#علی برادر خدام خسروشاهی

توضیح کد به زبان ساده:​

  1. یه list خالی به اسم result برای ذخیرهی جواب میسازیم.
  2. حداقل طول بین word1 و word2 رو پیدا میکنیم تا بدونیم چند بار باید یکیدرمیون اضافه کنیم.
  3. با for حلقه میزنیم و از هر کدوم یه کاراکتر برمیداریم و به result اضافه میکنیم.
  4. اگر یکی از رشتهها بلندتر بود، بقیهی حروفش رو به result اضافه میکنیم.
  5. در نهایت result رو به یک رشته تبدیل کرده و برمیگردونیم.

نکته:​

  • تو result.append(word1[min_length:]) از slicing استفاده کردیم که خیلی تمیز و سریع کار میکنه و بقیهی حروف باقیمونده رو اضافه میکنه.
  • چون result یه لیسته، در نهایت با "".join(result) اون رو به یک رشتهی نهایی تبدیل میکنیم.


حالا که کد رو فهمیدی، میتونی خودت یه مثال جدید تست کنی؟ 😉

علی برادر خدام خسروشاهی
 
« انجمن رمان نویسی / دانلود رمان / تک رمان / انجمن تک رمان / انجمن راشای »

حل سوال استخدامی برنامه نویسی پایتون قسمت دوم با علی برادر خدام خسروشاهی​

LeetCode 75

1071. Greatest Common Divisor of Strings

For two strings s and t, we say "t divides s" if and only if s = t + t + t + ... + t + t (i.e., t is concatenated with itself one or more times).

Given two strings str1 and str2, return the largest string x such that x divides both str1 and str2.

Example 1:

Input: str1 = ABCABC, str2 = ABC
Output: ABC
Example 2:

Input: str1 = ABABAB, str2 = ABAB
Output: AB
Example 3:

Input: str1 = LEET, str2 = CODE
Output: ""
Constraints:
  • 1 <= str1.length, str2.length <= 1000​
  • str1 and str2 consist of English uppercase letters.​
برای حل این مسئله، باید بزرگ‌ترین رشته‌ای (x) رو پیدا کنیم که هم str1 و هم str2 رو بدون باقی‌مانده تقسیم کنه، یعنی بتونه چند بار پشت سر هم تکرار بشه تا هر دو رشته رو بسازه.

چطور الگوریتمش رو بفهمیم؟

۱. باید بفهمیم رشته‌ی مشترک تکرارشونده چیه

  • مثلا برای "ABCABC" و "ABC"، واضح‌ترین رشته‌ی تکرارشونده "ABC" هست.
  • برای "ABABAB" و "ABAB"، این رشته‌ی مشترک "AB" هست.
  • ولی برای "LEET" و "CODE"، هیچ رشته‌ی مشترکی نداریم، پس جواب "" خواهد بود.
۲. بزرگ‌ترین مقسوم‌علیه مشترک (GCD) طول‌های دو رشته رو پیدا کنیم

  • فرض کنیم str1 طول 6 داره و str2 طول 3، این دو عدد بزرگ‌ترین مقسوم‌علیه مشترک‌شون gcd(6, 3) = 3 هست.
  • این یعنی اگر جواب وجود داشته باشه، طولش برابر با gcd(len(str1), len(str2)) خواهد بود.
۳. چک کنیم که اون رشته‌ی کاندید واقعا می‌تونه کل دو رشته رو بسازه

  • اگر str1 و str2 هر دو از اون رشته‌ی کوتاه‌تر که gcd تعیین کرده، ساخته شده باشن، پس جواب همین رشته‌ست.
  • در غیر این صورت، جوابی وجود نداره و باید "" برگردونیم.

کد پایتون (با کلاس Solution)

Python:
from math import gcd



# برای پیدا کردن بزرگ‌ترین مقسوم‌علیه مشترک



class Solution:

def gcdOfStrings(self, str1: str, str2: str) -> str:



# اگر ترکیب‌شون با هم برابر نباشه، یعنی اشتراکی ندارن



if str1 + str2 != str2 + str1:

return ""



# پیدا کردن بزرگ‌ترین مقسوم‌علیه مشترک طول‌ها



gcd_length = gcd(len(str1), len(str2))



# استخراج رشته‌ی مشترک



return str1[:gcd_length]



# علی برادر خدام خسروشاهی

توضیح کد:

  1. اول چک می‌کنیم که آیا این دو رشته ترکیب‌پذیر هستن یا نهstr1 + str2 != str2 + str1 یعنی اگر این دو رشته وقتی کنار هم قرار بگیرن نتیجه‌ی یکسانی نداشته باشن، هیچ رشته‌ی مشترکی وجود نداره و باید "" برگردونیم.
    مثلا "ABCABC" + "ABC" == "ABC" + "ABCABC" پس می‌شه حلش کرد.
    ولی "LEET" + "CODE" != "CODE" + "LEET" پس جواب "" خواهد بود.
  2. بعدش بزرگ‌ترین مقسوم‌علیه مشترک (GCD) بین طول‌های دو رشته رو حساب می‌کنیمgcd(6, 3) = 3 یعنی اگر رشته‌ای مشترک وجود داشته باشه، طولش 3 خواهد بود.
  3. در نهایت، اولین gcd_length کاراکتر از str1 رو برمی‌گردونیماگر جواب وجود داشته باشه، همیشه str1[:gcd_length] بهترین گزینه است.


چرا این الگوریتم کار می‌کنه؟

  1. O(n)
کار می‌کنه، چون فقط یکبار چک می‌کنیم که رشته‌ها ترکیب‌شون برابر باشه، و بعد از تابع gcd که مقدارش حداکثر O(log n) هست استفاده می‌کنیم.

2. نیازی به حلقه‌ی پیچیده یا برش‌های متعدد نداره، پس سریع اجرا می‌شه.

3. از یک مفهوم ریاضی (GCD) استفاده می‌کنه که باعث می‌شه سریع به جواب برسیم.

جمع‌بندی

  • اول چک کردیم که دو رشته با هم سازگار هستن یا نه.
  • بعد طول بزرگ‌ترین رشته‌ی تکراری ممکن رو پیدا کردیم (gcd طول‌ها).
  • اون مقدار رو از ابتدای str1 برگردوندیم، که جواب صحیح خواهد بود.
این روش تمیز، بهینه و ساده هست، حالا تو هم می‌تونی مثال‌های جدید امتحان کنی! 🚀😊

علی برادر خدام خسروشاهی
 
« انجمن رمان نویسی / دانلود رمان / تک رمان / انجمن تک رمان / انجمن راشای »

حل سوال استخدامی برنامه نویسی پایتون قسمت سوم با علی برادر خدام خسروشاهی​

LeetCode 75

1431. Kids With the Greatest Number of Candies

There are n kids with candies. You are given an integer array candies, where each candies represents the number of candies the ith kid has, and an integer extraCandies, denoting the number of extra candies that you have.

Return a boolean array result of length n, where result is true if, after giving the ith kid all the extraCandies, they will have the greatest number of candies among all the kids, or false otherwise.

Note that multiple kids can have the greatest number of candies.

Example 1:

Input: candies = [2,3,5,1,3], extraCandies = 3
Output: [true,true,true,false,true]
Explanation: If you give all extraCandies to:
- Kid 1, they will have 2 + 3 = 5 candies, which is the greatest among the kids.
- Kid 2, they will have 3 + 3 = 6 candies, which is the greatest among the kids.
- Kid 3, they will have 5 + 3 = 8 candies, which is the greatest among the kids.
- Kid 4, they will have 1 + 3 = 4 candies, which is not the greatest among the kids.
- Kid 5, they will have 3 + 3 = 6 candies, which is the greatest among the kids.
Example 2:

Input: candies = [4,2,1,1,2], extraCandies = 1
Output: [true,false,false,false,false]
Explanation: There is only 1 extra candy.
Kid 1 will always have the greatest number of candies, even if a different kid is given the extra candy.
Example 3:

Input: candies = [12,1,12], extraCandies = 10
Output: [true,false,true]
Constraints:

  • n == candies.length
  • 2 <= n <= 100
  • 1 <= candies <= 100
    [*]1 <= extraCandies <= 50

برای حل این مسئله، باید بررسی کنیم که اگر به هر بچه تمام آب‌نبات‌های اضافی رو بدیم، آیا اون بچه می‌تونه بیشترین تعداد آب‌نبات رو بین همه داشته باشه یا نه.

چطور الگوریتمش رو بفهمیم؟

  1. پیدا کردن بیشترین تعداد آب‌نباتی که یک بچه در حال حاضر داره چون فقط وقتی می‌تونیم از بقیه جلو بزنیم که تعدادمون از حداکثر موجود بیشتر بشه.
    مثلا برای [2,3,5,1,3] مقدار ماکسیمم 5 هست.
  2. بررسی کنیم اگر به هر بچه تمام extraCandies رو بدیم، آیا از مقدار ماکسیمم بیشتر یا برابر می‌شه؟اگر candies + extraCandies >= max_candies باشه، یعنی اون بچه می‌تونه جزء بیشترین‌ها بشه و مقدار True می‌گیره.
    در غیر این صورت مقدار False برمی‌گردونیم.

کد پایتون (با کلاس Solution):
Python:
class Solution:

def kidsWithCandies(self, candies: list[int], extraCandies: int) -> list[bool]:

max_candies = max(candies)

return [candy + extraCandies >= max_candies for candy in candies]

#علی برادر خدام خسروشاهی

توضیح کد:

  1. مقدار بیشترین آب‌نبات در candies رو ذخیره می‌کنیم (max_candies = max(candies)).
  2. یک لیست comprehension استفاده می‌کنیم که برای هر candy بررسی کنه:اگر candy + extraCandies >= max_candies بود، مقدار True می‌گیره.
    در غیر این صورت False.

چرا این الگوریتم خوبه؟

✅ سریع اجرا می‌شه (O(n)):

  • پیدا کردن max زمان O(n) می‌بره.
  • بررسی مقدار هر عنصر هم O(n) هست.
  • در کل O(n) + O(n) = O(n) که خیلی سریعه.
✅ خوانا و تمیزه

  • به جای حلقه‌های طولانی، فقط با یک خط لیست رو می‌سازیم.
✅ بهینه و بدون نیاز به لیست اضافی

  • لیست نهایی مستقیما با لیست comprehension ساخته می‌شه.
 
« انجمن رمان نویسی / دانلود رمان / تک رمان / انجمن تک رمان / انجمن راشای »

حل سوال استخدامی برنامه نویسی پایتون قسمت چهارم با علی برادر خدام خسروشاهی​


LeetCode75

605. Can Place Flowers

You have a long flowerbed in which some of the plots are planted, and some are not. However, flowers cannot be planted in adjacent plots.

Given an integer array flowerbed containing 0's and 1's, where 0 means empty and 1 means not empty, and an integer n, return true if n new flowers can be planted in the flowerbed without violating the no-adjacent-flowers rule and false otherwise.

Example 1:

Input: flowerbed = [1,0,0,0,1], n = 1
Output: true
Example 2:

Input: flowerbed = [1,0,0,0,1], n = 2
Output: false
Constraints:
  • 1 <= flowerbed.length <= 2 * 104​
  • flowerbed is 0 or 1.

    [*]
    There are no two adjacent flowers in flowerbed.​
    [*]
    0 <= n <= flowerbed.length​

تحلیل و فهم مسئله

  • یک آرایه‌ی flowerbed داریم که شامل 0 و 1 است:1 یعنی جای گل کاشته شده.
    0 یعنی جای خالی.
  • نمی‌توانیم دو گل کنار هم بکاریم.
  • باید ببینیم آیا می‌توانیم n گل جدید بکاریم یا نه.

الگوریتم حل مسئله

  1. روی کل آرایه flowerbed حرکت می‌کنیم و بررسی می‌کنیم که آیا در i می‌توان گل کاشت یا نه.
  2. شرایط کاشتن گل در i‌ام:خانه‌ی i باید 0 باشد.
    خانه‌ی قبلی (i-1) و بعدی (i+1) هم 0 باشند (یا خارج از محدوده باشند).
  3. اگر گل بکاریم، مقدار flowerbed را 1 می‌کنیم و n را یکی کم می‌کنیم.
    [*]اگر n == 0 شد، یعنی گل‌ها را کاشتیم و باید True برگردانیم.
    [*]اگر در پایان n هنوز مثبت بود، یعنی نشد همه گل‌ها را بکاریم، پس False برمی‌گردانیم.


کد پایتون (با کلاس Solution):

Python:
class Solution:

def canPlaceFlowers(self, flowerbed: list[int], n: int) -> bool:

for i in range(len(flowerbed)):

# اگر همه گل‌ها کاشته شدن، پایان بده

return True

if (flowerbed[i] == 0 and

(i == 0 or flowerbed[i-1] == 0) and

(i == len(flowerbed)-1 or flowerbed[i+1] == 0)):

# می‌تونیم گل بکاریم

flowerbed[i] = 1

n -= 1

# اگر `n` گل کاشته شد، True برگردون

return n == 0

#علی برادر خدام خسروشاهی

توضیح کد:

  1. حلقه روی flowerbedبررسی می‌کنیم که آیا می‌توان در i گل کاشت یا نه.
    چک می‌کنیم که i، i-1، i+1 صفر باشند.
    اگر شد، مقدار flowerbed را 1 می‌کنیم و n -= 1 انجام می‌دهیم.
    اگر n == 0 شد، یعنی کافی بوده و True برمی‌گردانیم.
    [*]در پایان، اگر هنوز n > 0 باشد، False برمی‌گردانیم.



تحلیل زمانی

✅ زمان اجرای O(n)

  • فقط یکبار روی آرایه حرکت می‌کنیم، پس عملکرد سریع است.
✅ بدون لیست اضافی (O(1) فضای اضافی)

  • مستقیماً روی flowerbed تغییر می‌دهیم، پس حافظه اضافی مصرف نمی‌کنیم.
✅ مؤثر و ساده

  • به جای محاسبات پیچیده، از یک حلقه‌ی ساده و چند شرط منطقی استفاده کردیم.
 
« انجمن رمان نویسی / دانلود رمان / تک رمان / انجمن تک رمان / انجمن راشای »

حل سوال استخدامی برنامه نویسی پایتون قسمت پنجم با علی برادر خدام خسروشاهی​

LeetCode75

345. Reverse Vowels of a String

Given a string s, reverse only all the vowels in the string and return it.

The vowels are 'a', 'e', 'i', 'o', and 'u', and they can appear in both lower and upper cases, more than once.

Example 1:

Input:
s = "IceCreAm"

Output: "AceCreIm"

Explanation:

The vowels in s are ['I', 'e', 'e', 'A']. On reversing the vowels, s becomes "AceCreIm".

Example 2:

Input:
s = "leetcode"

Output: "leotcede"

Constraints:
  • 1 <= s.length <= 3 * 105​
  • s consist of printable ASCII characters.​

📌 تحلیل و فهم مسئله

ما یه رشته s داریم و باید فقط حروف صدادار (vowels) داخلش رو برعکس کنیم، در حالی که بقیه حروف همون‌جوری باقی بمونن.

🔠 حروف صدادار:
حروف صدادار در زبان انگلیسی این‌ها هستن:

  • 'a', 'e', 'i', 'o', 'u'
  • هم حروف کوچک (aeiou) و هم حروف بزرگ (AEIOU) جزو صدادارها حساب می‌شن.


📌 چطور الگوریتمش رو بفهمیم؟

برای حل این مسئله باید فقط جای حروف صدادار رو عوض کنیم.
پس بهتره از یه روش استفاده کنیم که بدون جابه‌جایی غیرضروری، فقط صدادارها رو تغییر بده.

✍️ مراحل حل مسئله

  1. پیدا کردن همه‌ی حروف صدادار در رشته و ذخیره‌ی اون‌هایه لیست (vowels) درست می‌کنیم که فقط حروف صدادار s رو نگه داره.
    اون‌ها رو به ترتیب معکوس برمی‌گردونیم.
  2. حلقه‌ی دوم برای جایگزین کردن صدادارهایه لیست قابل تغییر از s می‌سازیم.
    وقتی به یه حرف صدادار رسیدیم، از لیست vowels مقدار جدید رو برمی‌داریم و جایگزین می‌کنیم.
📌 کد پایتون (با کلاس Solution):
Python:
class Solution:

def reverseVowels(self, s: str) -> str:

vowels = {'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'}

# چون رشته‌ها تغییرناپذیر هستن، تبدیل به لیست می‌کنیم

s = list(s)

# دو اشاره‌گر برای حرکت از ابتدا و انتها

left, right = 0, len(s) - 1

while left < right:

# حرکت به سمت راست تا وقتی که به صدادار برسیم

while left < right and s[left] not in vowels:

left += 1

# حرکت به سمت چپ تا وقتی که به صدادار برسیم

while left < right and s[right] not in vowels:

right -= 1

# اگر هنوز اشاره‌گرها عبور نکردن، جابه‌جا کنیم

if left < right:

s[left], s[right] = s[right], s[left]

left += 1

right -= 1

# تبدیل لیست به رشته

return ''.join(s)

#علی برادر خدام خسروشاهی

📌 توضیح مرحله‌به‌مرحله کد

  1. تعریف vowelsیه مجموعه (set) از حروف صدادار (کوچک و بزرگ) ایجاد کردیم.
    استفاده از set باعث می‌شه که چک کردن یه حرف خیلی سریع باشه (O(1)).
  2. تبدیل رشته به لیست رشته‌ها (str) قابل تغییر نیستن، پس اونا رو به لیست (list) تبدیل می‌کنیم تا بتونیم جایگزین کنیم.
  3. دو اشاره‌گر (left و right)left از اول رشته شروع می‌کنه.
    right از انتهای رشته شروع می‌کنه.
    هدف اینه که حروف صدادار رو از ابتدا و انتها پیدا کنیم و جایگزین کنیم.
  4. حلقه‌ی while برای جابه‌جایی حروف صداداراگر s
    صدادار نبود، به جلو حرکت کن (left += 1)
    اگر s
    صدادار نبود، به عقب حرکت کن (right -= 1)
    وقتی دو تا صدادار پیدا شد، جابه‌جا کن.​

    [*]برگرداندن لیست به رشته در نهایت ''.join(s) می‌زنیم تا لیست رو به رشته برگردونیم.

📌 تحلیل زمانی و کارایی

✅ پیچیدگی زمانی (O(n))

  • چون فقط یه بار روی s حرکت می‌کنیم و در هر مرحله یکی از دو اشاره‌گر (left و right) جلو میره، حداکثر O(n) اجرا داره.
✅ پیچیدگی فضایی (O(n))

  • چون یک لیست کمکی برای s ساختیم، به اندازه O(n) فضا نیاز داریم.
✅ راه‌حل سریع و بهینه

  • این روش نسبت به ذخیره و معکوس کردن مستقیم حروف صدادار بهتر و سریع‌تره، چون تعداد جابه‌جایی‌ها کمتره.

📌 نتیجه‌گیری

✅ ما یاد گرفتیم که چطور فقط حروف صدادار رو معکوس کنیم، بدون اینکه تغییری در بقیه رشته بدیم.
✅ از دو اشاره‌گر (two pointers) استفاده کردیم که سرعت رو بهبود بخشید.
✅ روش ما هم کارآمد (O(n)) و هم ساده بود و به راحتی روی رشته‌های طولانی هم اجرا می‌شه. 🚀😊
 
« انجمن رمان نویسی / دانلود رمان / تک رمان / انجمن تک رمان / انجمن راشای »

حل سوال استخدامی برنامه نویسی پایتون قسمت ششم با علی برادر خدام خسروشاهی​

LeetCode75

151. Reverse Words in a String

Given an input string s, reverse the order of the words.

A word is defined as a sequence of non-space characters. The words in s will be separated by at least one space.

Return a string of the words in reverse order concatenated by a single space.

Note that s may contain leading or trailing spaces or multiple spaces between two words. The returned string should only have a single space separating the words. Do not include any extra spaces.

Example 1:

Input: s = &quotthe sky is blue&quot
Output: &quotblue is sky the&quot
Example 2:

Input: s = &quot hello world &quot
Output: &quotworld hello&quot
Explanation: Your reversed string should not contain leading or trailing spaces.
Example 3:

Input: s = &quota good example&quot
Output: &quotexample good a&quot
Explanation: You need to reduce multiple spaces between two words to a single space in the reversed string.
Constraints:
  • 1 &lt;= s.length &lt;= 104​
  • s contains English letters (upper-case and lower-case), digits, and spaces ' '.​
  • There is at least one word in s.​

📌 تحلیل و فهم مسئله

ما یک رشته s داریم که شامل چندین کلمه‌ی جداشده با فاصله‌ها (spaces) است.
هدف ما:

  1. ترتیب کلمات را معکوس کنیم (کلمه‌های آخر بیاد اول و بالعکس).
  2. تمام فاصله‌های اضافی را حذف کنیم (فقط یک فاصله بین هر دو کلمه باشد).
  3. فاصله‌های اول و آخر را حذف کنیم.

📌 روش حل

  1. تقسیم (split())رشته را با استفاده از split() بر اساس فاصله‌ها به یک لیست از کلمات تبدیل می‌کنیم.
    این کار تمام فاصله‌های اضافی را خودبه‌خود حذف می‌کند.
  2. معکوس‌سازی (reverse())لیست کلمات را برعکس می‌کنیم تا ترتیب موردنظر را بدست آوریم.
  3. ترکیب (join())از join() استفاده می‌کنیم تا کلمات را با یک فاصله به هم متصل کنیم.


📌 کد پایتون (با کلاس Solution):
Python:
class Solution:

def reverseWords(self, s: str) -> str:

# تقسیم رشته به لیست کلمات (فضاهای اضافی حذف می‌شوند)

words = s.split()

# معکوس کردن لیست

words.reverse()

# پیوستن کلمات با یک فاصله‌ی واحد

return " ".join(words)

#علی برادر خدام خسروشاهی

📌 توضیح مرحله‌به‌مرحله کد

  1. <strong>split()</strong>s.split() رشته را به لیستی از کلمات تقسیم می‌کند و فاصله‌های اضافی را حذف می‌کند.
    ✅ " hello world " → ["hello", "world"]
    ✅ "a good example" → ["a", "good", "example"]<br>
  2. reverse()لیست را معکوس می‌کنیم.
    ✅ ["hello", "world"] → ["world", "hello"]
    ✅ ["a", "good", "example"] → ["example", "good", "a"]<br>
  3. join()کلمات را با یک فاصله در کنار هم قرار می‌دهیم.
    ✅ ["world", "hello"] → "world hello"
    ✅ ["example", "good", "a"] → "example good a"<br>

📌 تحلیل زمانی و کارایی

✅ پیچیدگی زمانی (O(n))

  • split() و join() هر دو <strong>O(n)</strong> هستند.
  • reverse() هم در <strong>O(n)</strong> اجرا می‌شود.
  • در مجموع، پیچیدگی زمانی O(n) است.
✅ پیچیدگی فضایی (O(n))

  • چون split() یک لیست جدید ایجاد می‌کند، به اندازه O(n) فضا مصرف می‌شود.


📌 روش جایگزین (با split(" ") و strip()))

به جای split() که خودبه‌خود فاصله‌های اضافی را حذف می‌کند، می‌توانیم از split(" ") همراه با strip() استفاده کنیم.

📌 ایده:

1.
ابتدا فاصله‌های ابتدا و انتهای رشته را حذف کنیم (strip()).

2.
سپس رشته را با split(" ") تقسیم کنیم (که باعث ایجاد لیستی شامل برخی " "های اضافی می‌شود).

3.
فقط کلمات غیرخالی را نگه داریم.

4.
معکوس کنیم و با یک فاصله join() کنیم.

📌 کد جایگزین:
Python:
class Solution:

def reverseWords(self, s: str) -> str:

# حذف فاصله‌های اضافی و نگه‌داشتن کلمات معتبر

words = [word for word in s.strip().split(" ") if word]

# معکوس کردن لیست و پیوند با فاصله

return " ".join(reversed(words))

#علی برادر خدام خسروشاهی

📌 توضیح مرحله‌به‌مرحله کد

✅ strip()

  • فاصله‌های اول و آخر رشته را حذف می‌کند.
    ورودی: " hello world " → خروجی: "hello world"
✅ split(" ")

  • این متد رشته را بر اساس تمام فاصله‌های بین کلمات تقسیم می‌کند (حتی فاصله‌های اضافی).
    ورودی: "a good example" → خروجی: ["a", "good", "", "", "example"]
✅ فیلتر کردن کلمات غیرخالی (if word)

  • فقط کلمات معتبر را نگه می‌داریم.
    خروجی: ["a", "good", "example"]
✅ reversed()

  • لیست را معکوس می‌کنیم.
    خروجی: ["example", "good", "a"]
✅ join(" ")

  • کلمات را با یک فاصله به هم می‌چسبانیم.
    خروجی: "example good a"

✅ نتیجه:
هر دو روش کارآمدند، اما روش اول (split()) کوتاه‌تر و خواناتر است، درحالی‌که روش دوم در شرایط خاص کنترل بیشتری بر نحوه پردازش فاصله‌ها می‌دهد.
 
« انجمن رمان نویسی / دانلود رمان / تک رمان / انجمن تک رمان / انجمن راشای »

حل سوال استخدامی برنامه نویسی پایتون قسمت هفتم با علی برادر خدام خسروشاهی​

LeetCode75

238. Product of Array Except Self

Given an integer array nums, return an array answer such that answer is equal to the product of all the elements of nums except nums.

The product of any prefix or suffix of nums is guaranteed to fit in a 32-bit integer.

You must write an algorithm that runs in O(n) time and without using the division operation.

Example 1:

Input: nums = [1,2,3,4]
Output: [24,12,8,6]
Example 2:

Input: nums = [-1,1,0,-3,3]
Output: [0,0,9,0,0]
Constraints:

  • 2 &lt;= nums.length &lt;= 105​
  • -30 &lt;= nums &lt;= 30

    [*]
    The input is generated such that answer is guaranteed to fit in a 32-bit integer.



📌 محصول آرایه به جز خود عنصر (O(n) بدون تقسیم)

این سؤال می‌خواهد که برای هر عنصر آرایه، حاصل‌ضرب تمام عناصر دیگر محاسبه شود، اما بدون استفاده از عمل تقسیم.
ما باید راهی پیدا کنیم که در زمان O(n) حل شود.

📌 ایده‌ی اصلی (استفاده از دو آرایه‌ی prefix و suffix)

✅ ایده‌ی کلی این است که برای هر عنصر nums:

  • حاصل‌ضرب همه عناصر قبل از آن (prefix product)
  • حاصل‌ضرب همه عناصر بعد از آن (suffix product)
  • سپس این دو مقدار را در هم ضرب کنیم.
بدون نیاز به O(n²) یا تقسیم، این کار را در O(n) انجام می‌دهیم.

📌 کد O(n) بدون تقسیم:
Python:
class Solution:

def productExceptSelf(self, nums):

n = len(nums)

# مقدار اولیه برای همه عناصر برابر ۱ است.

answer = [1] * n

# ۱. محاسبه‌ی محصولات Prefix از چپ به راست

prefix = 1

for i in range(n):

answer[i] = prefix

# مقدار prefix را به‌روزرسانی کن

prefix *= nums[i]

# ۲. محاسبه‌ی محصولات Suffix از راست به چپ

suffix = 1

for i in range(n - 1, -1, -1):

# مقدار suffix را در مقدار فعلی answer[i] ضرب کن

answer[i] *= suffix

# مقدار suffix را به‌روزرسانی کن

suffix *= nums[i]

return answer

# علی برادر خدام خسروشاهی
📌 توضیح مرحله‌به‌مرحله

✅ ۱. محاسبه‌ی prefix (محصول عناصر قبل از nums)

  • prefix ابتدا ۱ است.
  • هر بار مقدار prefix در nums ضرب شده و در prefix بعدی ذخیره می‌شود.

✅ ۲. محاسبه‌ی suffix (محصول عناصر بعد از nums)

  • suffix ابتدا ۱ است.
  • مقدار answer در مقدار suffix ضرب شده و suffix به‌روزرسانی می‌شود.

📌 پیچیدگی زمانی و فضایی

✅ پیچیدگی زمانی: O(n) (دو بار عبور از آرایه)
✅ پیچیدگی فضایی: O(1) (چون فقط از متغیرهای prefix و suffix استفاده کردیم و answer را از قبل داشتیم)

📌 نتیجه‌گیری

  • این روش نیازی به O(n²) محاسبه‌ی ضرب ندارد.
  • این روش نیازی به تقسیم (/) ندارد که در برخی موارد مشکل ایجاد می‌کند.
  • این روش بهینه‌ترین روش O(n) برای این مسئله است. 🚀
 
« انجمن رمان نویسی / دانلود رمان / تک رمان / انجمن تک رمان / انجمن راشای »

حل سوال استخدامی برنامه نویسی پایتون قسمت هشتم با علی برادر خدام خسروشاهی​

LeetCode75

334. Increasing Triplet Subsequence

Given an integer array nums, return true if there exists a triple of indices (i, j, k) such that i &lt; j &lt; k and nums &lt; nums[j] &lt; nums[k]. If no such indices exists, return false.

Example 1:

Input: nums = [1,2,3,4,5]
Output: true
Explanation: Any triplet where i < j < k is valid.
Example 2:

Input: nums = [5,4,3,2,1]
Output: false
Explanation: No triplet exists.
Example 3:

Input: nums = [2,1,5,0,4,6]
Output: true
Explanation: The triplet (3, 4, 5) is valid because nums[3] == 0 < nums[4] == 4 < nums[5] == 6.
Constraints:

  • 1 &lt;= nums.length &lt;= 5 * 105​
  • -231 &lt;= nums &lt;= 231 - 1


📌 یافتن سه‌تایی افزایشی در O(n)

هدف: بررسی کنیم که آیا در آرایه‌ی nums سه عدد به ترتیب افزایشی (nums &lt; nums[j] &lt; nums[k] با i &lt; j &lt; k) وجود دارد یا نه.

ایده‌ی اصلی (دو عدد حداقلی نگه می‌داریم)

✅ روش بهینه:

  • دو مقدار **کوچک‌ترین (first) و دومین کوچک‌ترین (second) عددی که تاکنون دیده‌ایم را نگه می‌داریم.
  • هر عددی که بزرگ‌تر از این دو مقدار باشد، ثابت می‌کند که یک سه‌تایی افزایشی وجود دارد.
✅ چرا این روش O(n) است؟
چون فقط یک بار روی آرایه حرکت می‌کنیم و مقدار first و second را در هر مرحله به‌روز می‌کنیم.

📌 مراحل الگوریتم

  1. مقدار اولیه:دو متغیر first و second را مقداردهی اولیه می‌کنیم (∞ یعنی مقدار بسیار بزرگ).
    first = کوچک‌ترین مقدار دیده‌شده تاکنون.
    second = دومین کوچک‌ترین مقدار دیده‌شده تاکنون.
  2. پیمایش آرایه (nums)
    برای هر عدد num در nums:اگر num از first کوچک‌تر یا مساوی بود، مقدار first را به‌روز کن (first = num).
    در غیر این صورت، اگر num از second کوچک‌تر یا مساوی بود، مقدار second را به‌روز کن (second = num).
    در غیر این صورت، اگر num از second بزرگ‌تر بود، یعنی یک triplet پیدا شده است → مقدار True را برگردان.
  3. اگر تا پایان پیمایش هیچ tripletای پیدا نشد، False را برگردان.
📌 پیاده‌سازی کد:

Python:
class Solution:

def increasingTriplet(self, nums):

# کوچک‌ترین مقدار

first = float('inf')

# دومین کوچک‌ترین مقدار

second = float('inf')

for num in nums:

# مقدار جدید از first کوچک‌تر است → first را آپدیت کن

first = num

# مقدار جدید بین first و second است → second را آپدیت کن

second = num

else:

# مقدار جدید بزرگ‌تر از first و second است → سه‌تایی یافت شد

return True

# اگر کل آرایه را بررسی کردیم و پیدا نشد

return False

# علی برادر خدام خسروشاهی

بررسی مرحله به مرحله روی nums=[2, 1 , 5 , 0, 4, 6]
numfirst (کوچک ترین مقدار)second (دومین کوچک ترین مقدار)توضیح
22مقدار first را مقدار دهی اولیه کردیم
11مقدار first را کاهش دادیم
515مقدار second را مقدار دهی اولیه کردیم
005مقدار first را کاهش دادیم
404مقدار second را کاهش دادیم
604مقدار 6 از second(4) بزرگتر است پس True برمیگردانیم

📌 پیچیدگی زمانی و فضایی

✅ پیچیدگی زمانی: O(n) (چون فقط یک بار از چپ به راست حرکت می‌کنیم)
✅ پیچیدگی فضایی: O(1) (فقط دو متغیر first و second را نگه می‌داریم)

📌 نتیجه‌گیری

🚀 این روش O(n)، بهینه‌ترین راه برای پیدا کردن یک سه‌تایی افزایشی در آرایه است.
✔️ نیازی به دو حلقه تو در تو (O(n²)) یا مرتب‌سازی (O(n log n)) ندارد.
✔️ فقط با دو مقدار حداقلی (first و second) کل آرایه را در یک دور پردازش می‌کنیم.
 
« انجمن رمان نویسی / دانلود رمان / تک رمان / انجمن تک رمان / انجمن راشای »
عقب
بالا