0Pricing
DSA Interview Prep · درس

واجهة Python البرمجية للسلاسل النصية في المقابلات

تدرّب على أنماط split وjoin وreplace وfind وord/chr وتنسيق السلاسل التي تظهر في مسائل المقابلات المتعلقة بالتحليل والتحويل

واجهة Python البرمجية للسلاسل النصية في المقابلات درس مجاني في DSA Interview Prep على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في DSA Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة DSA Interview Prep 4 دروس في المجموع.

السلاسل النصية غير قابلة للتغيير في Python

السلاسل النصية في Python غير قابلة للتغيير — لا يمكنك تغيير حرف في موضعه. فكل عملية على سلسلة نصية تبدو كأنها تعدّلها تنشئ في الواقع سلسلة جديدة. وهذا يعني أن s[0] = 'X' ترفع استثناء TypeError. عندما تحتاج إلى التعديل في المكان نفسه، حوّل السلسلة أولًا إلى قائمة من الأحرف، ونفّذ عملك، ثم استخدم ''.join(chars) لإعادة بنائها. هذا هو النمط القياسي لمسائل تعديل السلاسل النصية في المقابلات.

s = 'hello'
# s[0] = 'H'  # TypeError!

# In-place mutation pattern:
chars = list(s)
chars[0] = 'H'
result = ''.join(chars)
print(result)  # 'Hello'

# Reversing a string
print(s[::-1])           # 'olleh'
print(''.join(reversed(s)))  # 'olleh'

split() وjoin(): تحليل السلاسل النصية وإنشاؤها

تقسم s.split(sep) سلسلة نصية عند فاصل وتعيد قائمة من السلاسل الفرعية. يقسم sep=None (وهو الإعداد الافتراضي) عند أي مسافة بيضاء ويتجاهل السلاسل الفارغة — وهو مثالي لتحليل الإدخال المفصول بمسافات. يضم 'sep'.join(iterable) السلاسل مع وضع فاصل بينها. ويُعد التعبير ' '.join(words) الطريقة الفعالة لإنشاء سلسلة نصية مفصولة بمسافات من قائمة — ولا تستخدم + داخل حلقة مطلقًا.

# split
sentence = '  hello   world  '
words = sentence.split()    # ['hello', 'world']
print(words)

csv = 'a,b,c,d'
parts = csv.split(',')      # ['a', 'b', 'c', 'd']
print(parts)

# join
print(' '.join(words))      # 'hello world'
print(','.join(['x','y','z']))  # 'x,y,z'

# Reverse words in a sentence
print(' '.join(sentence.split()[::-1]))  # 'world hello'

find() وindex() وin

تعيد s.find(sub) فهرس أول ظهور لـ sub، أو -1 إذا لم يُعثر عليه. وتفعل s.index(sub) الشيء نفسه، لكنها ترفع ValueError إذا لم يكن موجودًا — لذا يُفضّل استخدام find في كود المقابلات لتجنب الاستثناءات غير المعالجة. ويُجري العامل in للسلاسل النصية بحثًا عن سلسلة فرعية بتعقيد O(n×m)، مثل find. استخدم معاملي start وend الاختياريين للبحث ضمن شريحة دون نسخها.

s = 'abcabcabc'
print(s.find('bc'))          # 1  (first occurrence)
print(s.find('bc', 2))       # 4  (search from index 2)
print(s.find('xyz'))         # -1 (not found)
print('abc' in s)            # True

# Count occurrences manually
count = 0
start = 0
while True:
    idx = s.find('bc', start)
    if idx == -1: break
    count += 1
    start = idx + 1
print(count)  # 3

replace() وstrip() وطرائق حالة الأحرف

تعيد s.replace(old, new, count=-1) سلسلة نصية جديدة بعد استبدال جميع مرات الظهور (أو أول count مرات منها). تزيل s.strip() المسافات البيضاء في البداية والنهاية (أو الأحرف المحددة). وتنشئ طرائق حالة الأحرف lower() وupper() وcapitalize() وswapcase() سلاسل نصية جديدة — تذكّر حفظ القيم المعادة، فهي لا تعدّل السلسلة الأصلية. ويُعد توحيد حالة الأحرف قبل المقارنة ضروريًا في المسائل غير الحساسة لحالة الأحرف.

s = '  Hello, World!  '
print(s.strip())          # 'Hello, World!'
print(s.strip().lower())  # 'hello, world!'

print('banana'.replace('a', 'o'))   # 'bonono'
print('banana'.replace('a', 'o', 2)) # 'bonona'

# Normalise for comparison
def same_ignoring_case(a, b):
    return a.lower() == b.lower()

print(same_ignoring_case('Racecar', 'racecar'))  # True

startswith() وendswith() وisalnum()

تعيد طرائق اختبار السلاسل النصية قيمًا منطقية، وتعمل بزمن O(k)، حيث k هو طول النمط. يقبل s.startswith(prefix) وs.endswith(suffix) صفوفًا لتحديد بدائل متعددة. وتختبر s.isalpha() وs.isdigit() وs.isalnum() وs.isspace() فئات الأحرف. وتُستخدم هذه الطرائق في مسائل المقابلات الخاصة بالتحقق من التناظر، والتحقق من الأعداد، وتحليل عناوين URL.

print('hello'.startswith('hel'))   # True
print('hello'.endswith(('lo', 'la')))  # True

# isalnum for palindrome filtering
def clean(s):
    return ''.join(c.lower() for c in s if c.isalnum())

print(clean('A man, a plan, a canal: Panama'))
# 'amanaplanacanalpanama'
print(clean('123abc!@#'))
# '123abc'

ord() وchr() والحساب باستخدام ASCII

تعيد ord(c) نقطة ترميز Unicode للحرف c. وتحول chr(n) عددًا صحيحًا إلى حرف مرة أخرى. وبالنسبة إلى الأحرف الصغيرة، تعطي ord(c) - ord('a') القيم من 0 إلى 25 — وهي طريقة بسيطة لبناء مصفوفات تكرار ثابتة الحجم 26 من دون خريطة تجزئة، وتكون أسرع عمليًا مع الأبجدية الإنجليزية. تظهر هذه التقنية في مسائل الجناس الناقص والتناظر.

print(ord('a'))   # 97
print(ord('z'))   # 122
print(chr(65))    # 'A'

# Frequency array for lowercase letters
def char_freq(s):
    freq = [0] * 26
    for c in s:
        freq[ord(c) - ord('a')] += 1
    return freq

print(char_freq('anagram'))  # [3,0,0,0,0,0,1,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0]
# index 0='a'(3), 6='g'(1), 12='m'(1), 17='r'(1)

تنسيق السلاسل النصية للإخراج

قد يكون الإخراج المنسق مهمًا أحيانًا في مقابلات البرمجة. توفر Python ثلاثة أساليب للتنسيق: %-formatting (القديم)، و.format() (التقليدي)، وf-strings (الحديث والمفضّل). تُعد f-strings الأكثر وضوحًا، وتدعم استخدام التعبيرات مباشرة: f'{value:.2f}' لتنسيق عدد عشري إلى منزلتين عشريتين. إن معرفة كيفية تنسيق الأعداد، وإضافة حشو إلى السلاسل النصية، وطباعة الجداول بسرعة، تقلل وقت تصحيح الأخطاء تحت الضغط.

name = 'Alice'
score = 95.678

# f-string (preferred in interviews)
print(f'{name}: {score:.1f}')      # Alice: 95.7
print(f'{name:>10}: {score:05.1f}') # right-align

# Zero-pad an integer
print(f'{42:04d}')   # 0042

# Join and format a list
nums = [1, 2, 3, 4]
print(', '.join(str(n) for n in nums))  # '1, 2, 3, 4'

إنشاء السلاسل النصية بكفاءة باستخدام join()

يؤدي ضم السلاسل النصية باستخدام + داخل حلقة إلى إنشاء سلسلة جديدة في كل تكرار، بتكلفة إجمالية O(n²) لـ n من الأحرف. النمط الصحيح هو: أضف الأجزاء إلى قائمة، ثم استدعِ ''.join(parts) في النهاية، وهو ما يحقق O(n). هذا أحد أكثر أنماط الأداء السيئة شيوعًا في Python. وذكر هذه المفاضلة في المقابلة يوضح فهمك لنموذج الذاكرة في Python.

# SLOW: O(n^2) due to repeated string allocation
def build_bad(chars):
    s = ''
    for c in chars:
        s += c  # creates a new string each time!
    return s

# FAST: O(n)
def build_good(chars):
    parts = []
    for c in chars:
        parts.append(c)
    return ''.join(parts)  # single allocation

# Or even more concise:
def build_best(chars):
    return ''.join(chars)

print(build_best(['h','e','l','l','o']))  # 'hello'

تحليل الأعداد الصحيحة والعشرية من السلاسل النصية

يُعد التحويل بين السلاسل النصية والأعداد أساسيًا في مسائل التحليل. تحلل int(s) وfloat(s) السلاسل النصية الرقمية، وترفعان ValueError عند وجود إدخال غير صالح. ولتحليل أكثر أمانًا، استخدم كتلة try-except. ويمكن لطرائق السلاسل النصية isdigit() وisnumeric() التحقق مسبقًا قبل التحويل. وتتطلب مسائل مثل 'atoi' (تحويل سلسلة نصية إلى عدد صحيح) التعامل مع المسافات البادئة، والإشارات، وتجاوز النطاق.

def my_atoi(s):
    s = s.lstrip()  # remove leading spaces
    if not s: return 0
    sign = 1
    idx = 0
    if s[0] in '-+':
        sign = -1 if s[0] == '-' else 1
        idx = 1
    num = 0
    while idx < len(s) and s[idx].isdigit():
        num = num * 10 + int(s[idx])
        idx += 1
    result = sign * num
    INT_MAX, INT_MIN = 2**31 - 1, -(2**31)
    return max(INT_MIN, min(INT_MAX, result))

print(my_atoi('   -42'))          # -42
print(my_atoi('4193 with words'))  # 4193

تقطيع السلاسل النصية في مسائل الخوارزميات

يُستخدم تقطيع السلاسل النصية باستمرار، لكنه ينطوي على تكاليف خفية: تنشئ s[i:j] سلسلة نصية جديدة طولها j-i بزمن O(j-i). عندما تحتاج إلى تمرير سلاسل فرعية إلى دوال递归ية، فكّر في تمرير الفهارس (start, end) بدلًا من السلسلة الفرعية نفسها لتجنب تكلفة تخصيص O(n²). ويهم هذا التحسين في مسائل مثل العثور على أطول سلسلة فرعية متناظرة، حيث تُختبر سلاسل فرعية كثيرة.

# Naive: O(n^3) because slicing inside nested loops
def is_palindrome_naive(s):
    return s == s[::-1]  # O(n) slice + O(n) compare

# Pass indices to avoid allocating substrings
def is_palindrome_range(s, left, right):
    while left < right:
        if s[left] != s[right]:
            return False
        left += 1; right -= 1
    return True  # O(right-left) time, O(1) space

print(is_palindrome_range('racecar', 0, 6))  # True
print(is_palindrome_range('hello',   0, 4))  # False

مرجع سريع لمقابلات السلاسل النصية

احرص على حفظ طرق التعامل مع السلاسل النصية التالية ذهنيًا لاستخدامها في المقابلات:

  • split / join — التحليل والبناء
  • strip / lstrip / rstrip — إزالة المسافات البيضاء
  • lower / upper — توحيد حالة الأحرف
  • find / index — تحديد مواضع السلاسل الفرعية
  • replace — الاستبدال
  • isalnum / isalpha / isdigit — التحقق من فئة المحرف
  • ord / chr — حسابات ASCII لمسائل الأبجديات الثابتة
  • startswith / endswith — التحقق من البادئة واللاحقة

# Combining methods: reverse words, preserve spaces
def reverse_words(s):
    return ' '.join(reversed(s.split()))

print(reverse_words('  hello   world  '))
# 'world hello'

# Check anagram using sorted strings
def is_anagram(s, t):
    return sorted(s) == sorted(t)

print(is_anagram('anagram', 'nagaram'))  # True
print(is_anagram('rat', 'car'))          # False

اختبار سريع

اختبر مدى استيعابك لمفاهيم Data Structures & Algorithms — Coding Interview Prep الواردة في هذا الدرس.

مراجعة الدرس

تعلمت في هذا الدرس ما يلي: السلاسل النصية في Python غير قابلة للتغيير — ويتطلب تعديلها تحويلها إلى قائمة، ثم تعديلها، ثم ضم عناصرها مجددًا، ويتيح ord/chr استخدام مصفوفات تكرارات ثابتة الحجم من 26 عنصرًا لمسائل الأحرف الإنجليزية الصغيرة، وهي أسرع من خرائط التجزئة عند التعامل مع أبجديات محدودة، وإن بناء السلاسل النصية باستخدام + داخل حلقة يكلف O(n²) — لذا اجمع العناصر دائمًا في قائمة واستخدم ''.join() في النهاية لتحقيق O(n). سنتناول بعد ذلك تقنية النافذة المنزلقة لمسائل السلاسل الفرعية.

الأسئلة الشائعة

هل درس «واجهة Python البرمجية للسلاسل النصية في المقابلات» مجاني؟

نعم — نص درس «واجهة Python البرمجية للسلاسل النصية في المقابلات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة DSA Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة DSA Interview Prep 4 دروس في المجموع.

ماذا ستتعلم في «واجهة Python البرمجية للسلاسل النصية في المقابلات»؟

تدرّب على أنماط split وjoin وreplace وfind وord/chr وتنسيق السلاسل التي تظهر في مسائل المقابلات المتعلقة بالتحليل والتحويل تتمرن على DSA Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ DSA Interview Prep؟

لا تُشترط خبرة سابقة. DSA Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.

كم من الوقت يستغرق درس «واجهة Python البرمجية للسلاسل النصية في المقابلات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس DSA Interview Prep هذا؟

نعم. كل درس في DSA Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. واجهة Python البرمجية للسلاسل النصية في المقابلات
  2. النافذة المنزلقة للسلاسل الجزئية
  3. التباديل الخرسانية وخرائط تكرار المحارف
  4. ترميز السلاسل النصية وعكسها ومتلازمات التناظر
← العودة إلى DSA Interview Prep