โจทย์
บวกค่าคะแนนของแต่ละตัวอักษรในคำหนึ่งคำ ไม่สนใจตัวพิมพ์เล็กหรือใหญ่ ไม่มีตัวคูณคะแนนบนกระดานหรือไทล์ตัวแทน (wildcard)
ค่าคะแนนของตัวอักษร:
A, E, I, O, U, L, N, R, S, T: ตัวละ 1 คะแนน
D, G: ตัวละ 2 คะแนน
B, C, M, P: ตัวละ 3 คะแนน
F, H, V, W, Y: ตัวละ 4 คะแนน
K: 5 คะแนน J, X: ตัวละ 8 คะแนน Q, Z: ตัวละ 10 คะแนน
ให้เขียนฟังก์ชัน word_tile_score(word)
อินพุต
word: คำที่ต้องการคำนวณคะแนน
เอาต์พุต
คืนค่าผลรวมคะแนนของตัวอักษรทั้งหมดในคำนั้น
เงื่อนไข
0 ≤ ความยาวของ word ≤ 10,000 มีเฉพาะตัวอักษรภาษาอังกฤษแบบ ASCII เท่านั้น ถ้าอินพุตว่างให้คืนค่า 0
ตัวอย่าง
อินพุต:
word = "code"
ผลลัพธ์ที่คาดหวัง:
expected = 7
อินพุต:
std::string word = "code";
ผลลัพธ์ที่คาดหวัง:
long long expected = 7;
อินพุต:
string word = "code";
ผลลัพธ์ที่คาดหวัง:
long expected = 7;
คำอธิบาย
C มีค่า 3, O มีค่า 1, D มีค่า 2, และ E มีค่า 1: 3 + 1 + 2 + 1 = 7
อินพุต:
word = "Quiz"
ผลลัพธ์ที่คาดหวัง:
expected = 22
อินพุต:
std::string word = "Quiz";
ผลลัพธ์ที่คาดหวัง:
long long expected = 22;
อินพุต:
string word = "Quiz";
ผลลัพธ์ที่คาดหวัง:
long expected = 22;
คำอธิบาย
ตัวพิมพ์เล็กหรือใหญ่ไม่มีผล Q + U + I + Z ได้ 10 + 1 + 1 + 10 = 22
แนวทางการแก้
ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ
คำใบ้ 1
ตัวอักษรแต่ละตัวมีคะแนนตายตัว จึงหาคะแนนคำโดยบวกค่าน้ำหนักของแต่ละตัวอักษร
คำใบ้ 2
ใช้ lookup table แบบไม่สนตัวพิมพ์เล็กใหญ่จะทำให้แมปง่ายและเร็ว
คำใบ้ 3
อย่าลืมครอบคลุมตัวอักษรที่อนุญาตทุกตัว รวมถึงไทล์คะแนนสูงอย่าง Q และ Z
ความซับซ้อนที่คาดหวัง
เวลา O(n), หน่วยความจำเพิ่ม O(1)
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน