โจทย์
ในแต่ละขั้นตอน ให้เลือกเลขหลักฐานสิบที่ไม่เป็นศูนย์ซึ่งมีอยู่ในตัวเลขปัจจุบัน แล้วลบเลขหลักนั้นออก ตัวเลขที่เลือกจะมาจากค่าปัจจุบันหลังจากแต่ละขั้นตอน ค้นหาจำนวนขั้นตอนน้อยที่สุดที่ต้องใช้เพื่อให้ได้ศูนย์
เขียนฟังก์ชัน removing_digits(n)
อินพุต
n: จำนวนเริ่มต้นที่เป็นบวก
เอาต์พุต
คืนค่าจำนวนขั้นตอนการลบที่น้อยที่สุด
เงื่อนไข
1 ≤ n ≤ 1,000,000 การลบศูนย์ไม่ถือว่าเป็นการเดินหมากที่มีประโยชน์และไม่อนุญาตให้ทำ
ตัวอย่าง
อินพุต:
n = 14
ผลลัพธ์ที่คาดหวัง:
expected = 3
อินพุต:
long long n = 14;
ผลลัพธ์ที่คาดหวัง:
long long expected = 3;
อินพุต:
long n = 14;
ผลลัพธ์ที่คาดหวัง:
long expected = 3;
คำอธิบาย
14 → 10 → 9 → 0 ใช้สามขั้นตอน ไม่สามารถลบเลขหลักใดในขั้นแรกเพื่อให้ถึงศูนย์ได้ในสองขั้นตอน
อินพุต:
n = 7
ผลลัพธ์ที่คาดหวัง:
expected = 1
อินพุต:
long long n = 7;
ผลลัพธ์ที่คาดหวัง:
long long expected = 1;
อินพุต:
long n = 7;
ผลลัพธ์ที่คาดหวัง:
long expected = 1;
คำอธิบาย
ลบเลขหลักเดียวที่มีอยู่คือ 7 เพื่อให้ได้ 0 ทันที
แนวทางการแก้
ลองทำเองก่อน แล้วค่อยเปิดคำใบ้ทีละข้อ
คำใบ้ 1
แต่ละค่าขึ้นกับคำตอบที่ดีที่สุดของค่าที่เล็กกว่าซึ่งไปถึงได้ด้วยการลบเลขหนึ่งหลัก
คำใบ้ 2
ทำ dynamic programming ครอบคลุมค่าตั้งแต่ 0 ถึง n จะได้ไม่คำนวณซ้ำ
คำใบ้ 3
จำไว้ว่าเลขที่ลบได้เปลี่ยนไปทุกครั้งหลังลบ และ 0 ไม่ใช่ตัวเลือกที่ใช้ได้
ความซับซ้อนที่คาดหวัง
เวลา O(n * d), หน่วยความจำเพิ่ม O(n)
แหล่งอ้างอิง
โจทย์นี้ปรับให้เหมาะกับ CodeUtility กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน