On this page
โจทย์ String
นับ ตัด แปลง พลิก และตรวจสอบข้อความ — โจทย์ที่เจอบ่อยทั้งในงานจริงและสัมภาษณ์
โจทย์ String ฝึกใช้ index, slice และเมธอดจัดการข้อความ หลายข้อเป็นโจทย์สัมภาษณ์คลาสสิก ลองทำเองก่อนเปิดเฉลย
ข้อ 1 — นับสระ 🟢
รับข้อความภาษาอังกฤษ แล้วนับว่ามีสระ (a, e, i, o, u) กี่ตัว เช่น "hello" มีสระ 2 ตัว
เฉลย + คำอธิบาย
s = input("ข้อความ: ").lower()
vowels = "aeiou"
count = 0
for ch in s:
if ch in vowels:
count += 1
print(f"มีสระ {count} ตัว")แปลงเป็นตัวพิมพ์เล็กก่อน (lower) เพื่อให้ A และ a นับเหมือนกัน แล้ววนทีละตัวอักษร เช็คว่าอยู่ในชุดสระไหมด้วย in — สั้นกว่าการเขียน if เทียบทีละตัว
ข้อ 2 — กลับข้อความ 🟢
รับข้อความแล้วพิมพ์กลับด้าน เช่น "hello" → "olleh" (ลองทั้งแบบใช้ slice และแบบวน loop)
เฉลย + คำอธิบาย
s = input("ข้อความ: ")
# แบบสั้นด้วย slice
print(s[::-1])
# แบบวน loop เพื่อเข้าใจหลักการ
result = ""
for ch in s:
result = ch + result # เอาตัวใหม่ไว้หน้า
print(result)s[::-1] คือ slice ที่ก้าว -1 = อ่านจากท้ายมาหน้า เป็นสำนวนกลับลำดับที่สั้นที่สุด ส่วนแบบ loop: ต่อตัวอักษรใหม่ไว้ "หน้า" ผลลัพธ์เดิม ทำให้ลำดับกลับด้าน
ข้อ 3 — พาลินโดรม 🟢
เช็คว่าข้อความเป็นพาลินโดรมไหม (อ่านหน้า-หลังเหมือนกัน) เช่น "level", "radar" เป็น แต่ "hello" ไม่เป็น
เฉลย + คำอธิบาย
s = input("ข้อความ: ")
if s == s[::-1]:
print("เป็นพาลินโดรม")
else:
print("ไม่เป็น")พาลินโดรมคือข้อความที่เท่ากับตัวเองเมื่อกลับด้าน จึงเทียบ s == s[::-1] ได้เลย วิธีนี้ใช้ slice ในข้อ 2 มาต่อยอด — สังเกตว่าโจทย์ต่อยอดกันได้
ข้อ 4 — นับจำนวนคำ 🟢
รับประโยค แล้วนับว่ามีกี่คำ เช่น "the quick brown fox" มี 4 คำ (จัดการช่องว่างซ้ำ ๆ ด้วย)
เฉลย + คำอธิบาย
s = input("ประโยค: ")
words = s.split() # ตัดด้วยช่องว่าง (จัดการช่องว่างซ้ำให้เอง)
print(f"มี {len(words)} คำ")split() แบบไม่ใส่อะไรจะตัดด้วยช่องว่าง และรวมช่องว่างซ้ำ ๆ เป็นตัวเดียวให้อัตโนมัติ (เช่น "a b" ได้ ['a','b']) ปลอดภัยกว่า split(" ") ที่จะได้ค่าว่างปนมา
ข้อ 5 — นับความถี่ตัวอักษร 🟡
รับคำ แล้วแสดงว่าตัวอักษรแต่ละตัวปรากฏกี่ครั้ง เช่น "banana" → b:1, a:3, n:2
ใช้ dictionary เก็บคู่ ตัวอักษร → จำนวน ใช้ .get(ch, 0) เพื่อเริ่มนับจาก 0 เมื่อยังไม่เคยเห็นตัวนั้น
เฉลย + คำอธิบาย
s = input("คำ: ")
count = {}
for ch in s:
count[ch] = count.get(ch, 0) + 1
for ch, n in count.items():
print(f"{ch}: {n}")count.get(ch, 0) คืนค่าปัจจุบันของ ch ถ้ามี ไม่งั้นคืน 0 แล้วบวก 1 — เป็น pattern การนับความถี่ที่ใช้บ่อยมาก จำไว้ใช้ได้ทั้งนับตัวอักษร นับคำ และนับอะไรก็ได้
ข้อ 6 — Anagram 🟡
เช็คว่าสองคำเป็น anagram กันไหม (ใช้ตัวอักษรชุดเดียวกันแค่สลับตำแหน่ง) เช่น "listen" กับ "silent" เป็น anagram กัน
เฉลย + คำอธิบาย
a = input("คำที่ 1: ").lower()
b = input("คำที่ 2: ").lower()
# ถ้าเรียงตัวอักษรแล้วเท่ากัน = anagram
if sorted(a) == sorted(b):
print("เป็น anagram")
else:
print("ไม่เป็น")เคล็ดลับ: anagram ใช้ตัวอักษรชุดเดียวกัน ดังนั้นถ้า sort ตัวอักษรของทั้งสองคำแล้วได้ผลเท่ากัน ก็เป็น anagram กัน sorted("listen") และ sorted("silent") ต่างได้ ['e','i','l','n','s','t'] เหมือนกัน วิธีนี้สั้นและเข้าใจง่าย
ข้อ 7 — ตัวอักษรไม่ซ้ำตัวแรก 🔴
หาตัวอักษรตัวแรกในข้อความที่ไม่ซ้ำกับตัวอื่นเลย เช่น "leetcode" → 'l', "aabbc" → 'c' ถ้าไม่มีให้คืน None
เฉลย + คำอธิบาย
def first_unique(s):
count = {}
for ch in s: # นับความถี่ก่อน
count[ch] = count.get(ch, 0) + 1
for ch in s: # วนตามลำดับเดิม หาตัวแรกที่นับได้ 1
if count[ch] == 1:
return ch
return None
print(first_unique("leetcode")) # l
print(first_unique("aabb")) # Noneวน 2 รอบ: รอบแรกนับความถี่ทุกตัว (dict) รอบสองวนตามลำดับเดิมหาตัวแรกที่ความถี่เป็น 1 ทำไมต้องสองรอบ? เพราะรอบแรกต้องรู้ความถี่ครบก่อน ถึงจะตัดสินได้ในรอบสอง — complexity O(n) เร็วกว่าการเทียบทุกคู่ O(n²)
ข้อ 5–7 ใช้ dictionary นับความถี่เหมือนกัน นี่คือเครื่องมือสำคัญที่จะใช้ต่อในหัวข้อ Dictionary & Set ลองทำโจทย์เพิ่ม: นับคำที่ยาวที่สุดในประโยค, ลบช่องว่างซ้ำ