ส่วนติดต่อสตริงของ Python สำหรับการสัมภาษณ์
ฝึกใช้การแยก การเชื่อม การแทนที่ การค้นหา ord/chr และรูปแบบการจัดรูปแบบสตริงที่พบในโจทย์การแยกวิเคราะห์และแปลงข้อมูล
ส่วนติดต่อสตริงของ Python สำหรับการสัมภาษณ์ เป็นบทเรียน Coding Interview Prep ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Coding Interview Prep และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Coding 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) # 3replace(), 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')) # Truestartswith(), 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) และปลดล็อคส่วนที่เหลือของคอร์ส Coding Interview Prep ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Coding Interview Prep มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ส่วนติดต่อสตริงของ Python สำหรับการสัมภาษณ์”
ฝึกใช้การแยก การเชื่อม การแทนที่ การค้นหา ord/chr และรูปแบบการจัดรูปแบบสตริงที่พบในโจทย์การแยกวิเคราะห์และแปลงข้อมูล คุณปฏิบัติ Coding Interview Prep ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Coding Interview Prep หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Coding Interview Prep บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “ส่วนติดต่อสตริงของ Python สำหรับการสัมภาษณ์” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Coding Interview Prep นี้ได้ไหม
ได้ บทเรียน Coding Interview Prep ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ส่วนติดต่อสตริงของ Python สำหรับการสัมภาษณ์
- หน้าต่างเลื่อนสำหรับสตริงย่อย
- แอนนาแกรมและแผนผังความถี่อักขระ
- การเข้ารหัสสตริง การกลับลำดับ และพาลินโดรม