โจทย์
ข้อมูลที่ผู้ใช้พิมพ์มานั้นมักจะรกปนกัน คุณได้รับรายการของสตริงและต้องบวกเฉพาะรายการที่เป็น จำนวนเต็ม โดยไม่สนใจส่วนที่เหลือแทนที่จะทำให้โปรแกรมล้ม
รายการจะนับว่าใช้ได้ถ้าหลังจากตัดช่องว่างที่ต้นและท้ายออกแล้ว มีเครื่องหมาย + หรือ - แบบเลือกมีหรือไม่มีก็ได้ ตามด้วยตัวเลขอย่างน้อยหนึ่งตัว อย่างอื่นทั้งหมด (ข้อความว่าง, ทศนิยมเช่น "2.5", คำ) ให้ข้ามไป
Implement sum_valid_numbers(values).
อินพุต
values: รายการข้อมูลที่จะอ่าน
เอาต์พุต
คืนค่าผลรวมของจำนวนเต็มที่ถูกต้อง (0 ถ้าไม่มีรายการที่ใช้ได้เลย).
เงื่อนไข
0 ≤ จำนวนรายการ ≤ 1,000
แต่ละรายการยาวไม่เกิน 20 อักขระ ตัวเลขที่ถูกต้องอยู่ในช่วงจำนวนเต็ม 64 บิต
ตัวอย่าง
อินพุต:
values = ["10", " 5 ", "abc", "-3"]
ผลลัพธ์ที่คาดหวัง:
expected = 12
อินพุต:
std::vector<std::string> values = {"10", " 5 ", "abc", "-3"};
ผลลัพธ์ที่คาดหวัง:
long long expected = 12;
อินพุต:
string[] values = new string[] {"10", " 5 ", "abc", "-3"};
ผลลัพธ์ที่คาดหวัง:
long expected = 12;
คำอธิบาย
"10", " 5 " (ตัดช่องว่างออก) และ "-3" เป็นจำนวนเต็ม ส่วน "abc" ถูกข้าม 10 + 5 - 3 = 12
อินพุต:
values = ["2.5", "", "seven"]
ผลลัพธ์ที่คาดหวัง:
expected = 0
อินพุต:
std::vector<std::string> values = {"2.5", "", "seven"};
ผลลัพธ์ที่คาดหวัง:
long long expected = 0;
อินพุต:
string[] values = new string[] {"2.5", "", "seven"};
ผลลัพธ์ที่คาดหวัง:
long expected = 0;
คำอธิบาย
ไม่มีรายการใดเป็นจำนวนเต็ม ผลรวมจึงเป็น 0
แนวทางการแก้
ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ
คำใบ้ 1
ตัดช่องว่างก่อน แล้วค่อยดูว่าส่วนที่เหลือเป็นจำนวนเต็มที่ถูกต้องหรือไม่
คำใบ้ 2
การแปลงใน try/except (หรือตรวจทีละอักขระ) ช่วยให้ข้ามรายการที่ผิดได้โดยไม่หยุดโปรแกรม
คำใบ้ 3
เครื่องหมายเดี่ยว ๆ อย่าง "+" ไม่ใช่ตัวเลข
ความซับซ้อนที่คาดหวัง
เวลา O(ความยาวรวม), หน่วยความจำเพิ่ม O(1)
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน