מבחן אינטרנט, אחרי זה ראיון, מקום נחמד הרבה צעירים ואוירה טובה. התפקיד הוא פיתוח אוטומציה, כלומר כתיבת טסטים בפייתון, הטסטים האלה ירוצו ככל הנראה באופן קבוע, וקבוצת הרגרסיה אחראית לבדוק את התוצאות שלהם בשגרה. אני דוקא אוהב את החלוקה בין קבוצה שכותבת טסטים לקבוצה שמטפלת בפלטים היומיומיים של הטסטים הללו.
שאלות מתוך הראיון
מבחן אינטרנטי מקדים, הייתה לי שם שאלה על המערך כמו שהזכירו כאן : צריך להחזיר אינדקס i כך שסכום האיברים עד האיבר באינדקס i כולל, שווה לסכום האיברים מהאיבר באינדקס הi+1 , עד האיבר האחרון.
ובראיון הראשון עצמו:
1.כתוב פונקציה שמקבלת מספר טבעי ומחזירה את המספר בסדרת פיבונאצ׳י שהארגומנט הוא האינדקס שלו בסדרה.
מה יהיו המקרי קצה ? מה הקלט הכי גדול שעבורו נקבל תשובה נכונה מהפונקציה, בהינתן שהטיפוס קלט הואint בגודל 4 בתים?
2.שאלה על cache : נתון מחשב שמכיל דיסק בגודל 1M, ובנוסף זיכרון מהיר (cache) בגודל 1K, לקאש ולדיסק יש לכל אחד פונקצית write ופונקצית read. כתוב פונקציות write וread עבור המשתמש, שמשתמשות בפונקציות write וread של הדיסק והcache.
3. תכנן מחסנית כך שתוכל להחזיר את המקסימום מתוך האיברים שבמחסנית ב o(1)
אפשר להשתמש בכמות ליניארית של זיכרון.
4. תכנן מבני נתונים שכולל מערך בגודל n, שיש לו 3 מתודות שיפעלו כל אחת בo(1) :
set(index,value)
המערך במקום הindex יהפוך לvalue
get(index)
תחזיר את האיבר במקום הindex במערך
reset(value)
כל האיברים במערך יהיו value
תשובות
הוסף תשובה
|
לצפיה בתשובות
ינואר 2018
1. תשתמשו בשלושה משתנים שמתקדמים בלולאה, כמו שכבר הציעו פה.
לגבי המקריה קצה : בint , המספר הכי גדול שניתן להחזיר הוא 2 בחזקת 31 מינוס 1, ומצד שני, כמו שהמראיין אמר לי, הפיבונאצי באינדקס מסוים הוא בסדר גודל של 2 בחזקת האינדקס, ולכן, האינדקס הכי גבוה שעבורו לא יהיה אוברפלו הוא log של המספר הכי גדול שניתן לייצג בint, ולכן התשובה היא 31.
3.
תהשתמש במחסנית נוספת שתאחסן את המקסימום, כשמכניסים איבר מכניסים גם את המקסימום הנוכחי למחסנית השניה, כשמוציאים איבר מהמחסנית, מוציאים איבר גם ממחסנית המקסימומים. כבר העלו בשרשור הזה קישור לתשובה מוסברת היטב.
4.
כאשר עושים reset, נשמור את הערך ואת הזמן הנוכחי.
נקצה מערך של time stamp, עבור האיבר במקום הi במערך הרגיל, כשנעשה set : נשנה את האיבר במערך הרגיל, ונעדכן במערך הזמנים את הזמן הנוכחי.
get :כשנרצה לקרוא מהאיבר הi, נבדוק אם הreset האחרון קרה לפני הset האחרון לאיבר הi, אם הset קרה לפני הreset האחרון, נחזיר את האיבר של הreset האחרון, אחרת נחזיר את האיבר שנמצא במקום האינדקס המבוקש במערך.
היה ראיון טלפוני ולאחר מכן הזמינו אותי לראיון אישי בחברה מול שני מנהלי פיתוח
שאלות מתוך הראיון
יש לי רשימה:
[nums = [1, 2, 3, 9, -1, 1, 6
צריך לעבור על הרשימה ולהוציא את המיקום של המשתנה שהסכום של המספרים שלפניו שווה לסכום של המספרים שאחריו (במקרה הזה המספר הוא 9 והמיקום הוא 3)
תשובות
הוסף תשובה
|
לצפיה בתשובות
נובמבר 2017
nums = [1, 2, 3, 9, -1, 1, 6]
def getlist(nums_list):
container_start = 0
container_end = 0
for num in range(len(nums_list)):
if num == 0:
continue
else:
for x in range(0, num):
container_start += nums_list[x]
for y in range(num + 1, len(nums_list)):
container_end += nums_list[y]
if container_start == container_end:
return num
else:
container_start = 0
container_end = 0
print getlist(nums)
דצמבר 2017
רצים על כל המספרים ומייצרים מערכים של סכומים חלקיים, במקרה שלנו זה יהיה 21 15 14 15 6 3 1
ואז עושים את זה שוב, רק שרצים מהסוף, אז המערך יראה ככה 6 7 6 15 18 20 21
עכשיו רצים על שני המערכים החדשים עד שמגיעים לאינדקס ששני הערכים שווים, במקרה שלנו i=3 עם הערך 15
אפריל 2018
אפשר לעשות בסיבוכיות זמן של n^2, רצים על המערך ובכל ריצה סוכמים את המערך עד האינדקס ומהאינדס ומשווים.
דוגמא בפייטון (מצטער מראש על היישור לימין)
for i in range(len(my_list) - 1):
sum_before = sum(my_list[:i])
sum_after = sum(my_list[i + 1:])
if sum_before == sum_after:
print 'the index is {} and the number is {}'.format(i, my_list[i])
break
מרץ 2019
סוכמים את המספרים מימין ל2 וסוכמים את המספרים משמאל ל2 זה for ראשון לאחר מכן משווים בין שני הסכימות אם הם לא שווים אז מוסיפים לצד שמאל את הספרה 2 .
עכשיו עושים פור מהנקודה 3 עד הסוף
שבתוכה נוריד את המיקום הנוכחי מהסכימה הימנית (בכניסה הראשונה נוריד את 3)
ואז נשווה בין הסכימה הימנית לשמאלית . אם זה נכון נחזיר את הI אם לא אז נוסיף למערך השמאלי את 3 ( באיטרציה הראשונה)
מבחן באתר שלהם עם שתי שאלות לא קשות , ראיון עבודה עם בחורה קצת לא נעימה.
שאלות מתוך הראיון
שאלה שאני זוכר : נתון לך מערך של )(()(( סוגריים כאלו כמו שציירתי , לבדוק האם לכל סוגר פותח יש סוגר סוגר וגם צורה חוקית. זהירות לא לתת לה את הפתרון הידוע עם המחסנית היא תתעצבן עליכם.
תשובות
הוסף תשובה
|
לצפיה בתשובות
אוגוסט 2017
הפתרון הוא לאתחל משתנה לאפס עבור כל סוגר פותח ) להוסיף לו אחד עבור כל סוגר סוגר (להוריד ממנו אחד. אם במהלך הריצה הערך שלילי אז להחזיר false אם בסוף הריצה הערך לא אפס גם להחזיר flase אחרת true.
אוקטובר 2020
הפתרון עם המחסנית מתאים לשאלה דומה בה יש שני סוגי של סוגריים () []
1. מצא את המיקום במערך אשר מחלק אותו לשתי חלקים בעלי אותו סכום.
כלומר, צריך למצוא את המיקום ברשימה שבו סכום האיברים מתחילת המערך עד אינדקס i שווה לסכום האיברים מאיבר i+1 עד סוף המערך.
2. לממש בדיקות על הקוד ומקרי קצה על הפונקציה שכתבתם.
ניתן לממש בכול שפה.
תשובות
הוסף תשובה
|
לצפיה בתשובות
אוקטובר 2017
1. לעבור ולסכום את איברי המערך למשתנה sum. ואז לעבור שוב על איברי המערך ולסכום אותם ולהפסיק כאשר הסכום מגיע לsum/2