กลับไปยังโจทย์
ปานกลาง 0 ข้อที่แก้แล้ว อัตราผ่าน 0%

ลบตัวเลขเพื่อให้ได้ศูนย์

ใช้การลบตัวเลขให้น้อยที่สุดเพื่อให้ได้ศูนย์

สิ่งที่คุณจะได้เรียนรู้

  • จำลองกระบวนการเป็นสถานะและการเคลื่อนที่
  • คำนวณจำนวนขั้นน้อยสุดจนถึงศูนย์
  • เปรียบเทียบ DP กับทางลัดแบบละโมบ

โจทย์

ในแต่ละขั้นตอน ให้เลือกเลขหลักฐานสิบที่ไม่เป็นศูนย์ซึ่งมีอยู่ในตัวเลขปัจจุบัน แล้วลบเลขหลักนั้นออก ตัวเลขที่เลือกจะมาจากค่าปัจจุบันหลังจากแต่ละขั้นตอน ค้นหาจำนวนขั้นตอนน้อยที่สุดที่ต้องใช้เพื่อให้ได้ศูนย์

เขียนฟังก์ชัน removing_digits(n)

อินพุต

n: จำนวนเริ่มต้นที่เป็นบวก

เอาต์พุต

คืนค่าจำนวนขั้นตอนการลบที่น้อยที่สุด

เงื่อนไข

1 ≤ n ≤ 1,000,000 การลบศูนย์ไม่ถือว่าเป็นการเดินหมากที่มีประโยชน์และไม่อนุญาตให้ทำ

ตัวอย่าง

ตัวอย่างที่ 1
อินพุต:
n = 14

ผลลัพธ์ที่คาดหวัง:
expected = 3
อินพุต:
long long n = 14;

ผลลัพธ์ที่คาดหวัง:
long long expected = 3;
อินพุต:
long n = 14;

ผลลัพธ์ที่คาดหวัง:
long expected = 3;

คำอธิบาย

14 → 10 → 9 → 0 ใช้สามขั้นตอน ไม่สามารถลบเลขหลักใดในขั้นแรกเพื่อให้ถึงศูนย์ได้ในสองขั้นตอน

ตัวอย่างที่ 2
อินพุต:
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 กรุณาทำตามคำชี้แจงและข้อจำกัดด้านบน

เรียนรู้จากคนอื่น

แนวทางจากชุมชน

ยังไม่มีวิธีทำที่เผยแพร่ ลองแก้โจทย์นี้เพื่อแชร์วิธีแรก