16 בדצמבר 2022

שאלת ראיון [קל] - Happy Number

בשאלה זו נתבקש להחזיר תשובה לגבי מספר נתון האם הוא מספר "שמח". ההגדרה של מספר "שמח" היא מספר שבו סכום מכפלת הספרות שלו בלולאה אינסופית מגיעה ל-1.

Leetcode

דוגמא למספר שמח הוא המספר 19 כיוון שאם סוכמים את ריבוע הספרות שלו  מגיעים ל-82 ואם סוכמים את ריבוע סכום הספרות של 82 מגיעים ל-68 ואם ממשיכים בצורה זו סכום ריבוע הספרות יגיע ל-1 בסופו של דבר.


הקושי המרכזי בהבנת השאלה נעוץ לדעתי במילה "אינסופי". כולם יודעים שאין דבר כזה אינסופי בקוד - חייבים תנאי עצירה אחרת הלולאה תתקע לנצח והפונקציה לא תחזיר תשובה. 

בשאלה אין גם דרישות מיוחדות כמו סיבוכיות מקום או זמן מה שעשוי לפעמים לרמז על כיוון.

המפתח לפתרון מתחיל להיווצר רק עבור מי שמנסה ספרות שונות לדוגמא ומתחיל לראות מגמה כלשהי.

מתחילים עם כתיבת הפונקציה שמבצעת את פעולת סכום ריבועי הספרות ומחזירה אותו וננסה להריץ אותה בלולאה מוגבלת למספר לא גדול, נניח 50 ונדפיס את המספרים המתקבלים. 

נבחר במספר שרירותי, למשל - 12. נראה שברצף המספרים המתקבל ישנו רצף החוזר על עצמו שוב ושוב: [4, 16, 37, 58, 89, 145, 42, 20, 4] וכך גם במספרים אחרים שאינם עונים להגדרה של מספר "שמח".

זה מוביל אותנו למסקנה שכדי לעצור את הלולאה, אנחנו נצטרך להשתמש בזיכרון cache ובפעם הראשונה שמספר כלשהו יחזור על עצמו - אנחנו נעצור את הריצה ונחזיר False.

והפתרון המלא:

אין תגובות:

הוסף רשומת תגובה