0Pricing
DSA Interview Prep · บทเรียน

ส่วนติดต่อสตริงของ Python สำหรับการสัมภาษณ์

ฝึกใช้การแยก การเชื่อม การแทนที่ การค้นหา ord/chr และรูปแบบการจัดรูปแบบสตริงที่พบในโจทย์การแยกวิเคราะห์และแปลงข้อมูล

ส่วนติดต่อสตริงของ Python สำหรับการสัมภาษณ์ เป็นบทเรียน DSA Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน DSA Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส DSA Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

สตริงในไพธอนไม่เปลี่ยนแปลงได้

สตริงของไพธอนเป็น ชนิดที่เปลี่ยนแปลงไม่ได้ — คุณไม่สามารถเปลี่ยนอักขระ ณ ตำแหน่งเดิมได้ การดำเนินการกับสตริงทุกอย่างที่ดูเหมือนจะแก้ไขสตริง แท้จริงแล้วจะสร้างสตริงใหม่ขึ้นมา นั่นหมายความว่า 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(), การค้นหาด้วยดัชนี และการตรวจสอบการมีอยู่

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() ใช้ตรวจสอบประเภทของอักขระ ฟังก์ชันเหล่านี้ใช้ในโจทย์สัมภาษณ์เกี่ยวกับพาลินโดรมที่ถูกต้อง ตัวเลขที่ถูกต้อง และการแยกวิเคราะห์ที่อยู่เว็บ

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'

ฟังก์ชันแปลงรหัสอักขระและการคำนวณด้วย ASCII

ord(c) ส่งคืนจุดรหัสยูนิโค้ดของอักขระ 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)

การจัดรูปแบบสตริงสำหรับผลลัพธ์

ในการสัมภาษณ์การเขียนโปรแกรม บางครั้งผลลัพธ์ที่เรียบร้อยก็มีความสำคัญ ไพธอนมีรูปแบบการจัดรูปแบบสามแบบ ได้แก่ การจัดรูปแบบด้วย % (แบบเก่า), .format() (แบบดั้งเดิม) และสตริงแบบ f (แบบใหม่และเป็นที่นิยม) สตริงแบบ f อ่านเข้าใจง่ายที่สุดและรองรับนิพจน์ได้โดยตรง: f'{value:.2f}' จัดรูปแบบจำนวนทศนิยมให้มีทศนิยม 2 ตำแหน่ง การรู้วิธีจัดรูปแบบตัวเลข เติมช่องว่างให้สตริง และพิมพ์ตารางได้อย่างรวดเร็ว จะช่วยลดเวลาแก้จุดบกพร่องเมื่อต้องทำงานแข่งกับเวลา

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 ตัว รูปแบบที่ถูกต้องคือใช้ append ส่วนต่าง ๆ ลงในรายการ แล้วเรียก ''.join(parts) เมื่อสิ้นสุด ซึ่งใช้เวลา O(n) นี่เป็นหนึ่งในรูปแบบการเขียนที่ควรหลีกเลี่ยงด้านประสิทธิภาพของไพธอนที่พบบ่อยที่สุด ในการสัมภาษณ์ การกล่าวถึงข้อแลกเปลี่ยนนี้จะแสดงให้เห็นว่าคุณเข้าใจแบบจำลองหน่วยความจำของไพธอน

# 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 เมื่อข้อมูลนำเข้าไม่ถูกต้อง หากต้องการแยกวิเคราะห์อย่างปลอดภัยยิ่งขึ้น ให้ใช้บล็อกสำหรับลองทำและดักจับข้อผิดพลาด ฟังก์ชันสตริง isdigit() และ isnumeric() ใช้ตรวจสอบเบื้องต้นก่อนการแปลง โจทย์การแปลงสตริงเป็นจำนวนเต็มต้องจัดการช่องว่างนำหน้า เครื่องหมายบวกหรือลบ และค่าล้น

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) เมื่อต้องส่งสตริงย่อยให้ฟังก์ชันเรียกซ้ำ ควรพิจารณาส่งดัชนีเริ่มต้นและสิ้นสุดแทนการส่งสตริงย่อยจริง เพื่อหลีกเลี่ยงต้นทุนการจัดสรร 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

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจแนวคิดเรื่องโครงสร้างข้อมูลและอัลกอริทึม — การเตรียมตัวสัมภาษณ์การเขียนโปรแกรมจากบทเรียนนี้

ทบทวนบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า สตริงใน Python ไม่สามารถเปลี่ยนแปลงได้ — หากต้องการแก้ไข ต้องแปลงเป็นรายการก่อน แก้ไขรายการ แล้วจึงรวมกลับเป็นสตริง ord/chr ช่วยให้สร้างอาร์เรย์ความถี่ขนาดคงที่ 26 สำหรับปัญหาตัวอักษรพิมพ์เล็กได้ ซึ่งเร็วกว่าตารางแฮชสำหรับชุดอักขระที่มีขอบเขต และ การสร้างสตริงด้วย + ภายในลูปมีต้นทุน O(n²) — ควรสะสมผลลัพธ์ในรายการเสมอ แล้วใช้ ''.join() ในตอนท้ายเพื่อให้มีต้นทุน O(n) ถัดไป เราจะสำรวจเทคนิคหน้าต่างเลื่อนสำหรับปัญหาสตริงย่อย

คำถามที่พบบ่อย

บทเรียน “ส่วนติดต่อสตริงของ Python สำหรับการสัมภาษณ์” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ส่วนติดต่อสตริงของ Python สำหรับการสัมภาษณ์” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส DSA Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส DSA Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ส่วนติดต่อสตริงของ Python สำหรับการสัมภาษณ์”

ฝึกใช้การแยก การเชื่อม การแทนที่ การค้นหา ord/chr และรูปแบบการจัดรูปแบบสตริงที่พบในโจทย์การแยกวิเคราะห์และแปลงข้อมูล คุณปฏิบัติ DSA Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน DSA Interview Prep หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน DSA Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ส่วนติดต่อสตริงของ Python สำหรับการสัมภาษณ์” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน DSA Interview Prep นี้ได้ไหม

ได้ บทเรียน DSA Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ส่วนติดต่อสตริงของ Python สำหรับการสัมภาษณ์
  2. หน้าต่างเลื่อนสำหรับสตริงย่อย
  3. แอนนาแกรมและแผนผังความถี่อักขระ
  4. การเข้ารหัสสตริง การกลับลำดับ และพาลินโดรม
← กลับไปที่ DSA Interview Prep