שאלה מעניינת מאוד מתוך ראיון עבודה, אשמח לרעיונות.
ע"י: 1_אורח_כללי
פתרון פשוט
להשוות כל שני איברים סמוכים
לדוגמה
12345678
1.5 1.5 3.5. 3.5 5.5 5.5 7.5
ואז להשוות בין כל שני זוגות
1.5 3.5 , 5.5 7.5
ובסוף ממוצע בין הממוצעים
לפני 8 שנים
ע"י: 1_אורח_כללי
למעשה המפתח הוא בכפילות הערכים כיוון שזה מערך של 8 איברים(2^3)
נניח יש לנו מערך בגודל 4 לצורך הבסיס
1,2,3,4
אתה מזמן את הפונקציה פעם אחת עבור כל זוג אינדקסים צמודים
תקבל
1.5,1.5,3.5,3.5
שים לב שהערכים הצמודים כפולים לכן חיבור שלהם יתן לך 3 ו5 שזה למעשה מה שהיית מקבל אם הייתה עושה חישוב ממוצע לפי כל 2 תאים
תזמן את הפונקציה שוב עם קפיצות של 2 אינדקסים 1.5+3.5=5/2=2.5 וזה בדיוק מה שצריך בכל אחד מהתאים
בשביל מערך בגודל שמונה אתה תעשה ריצה נוספת עם קפיצות של 4 אינדקסים( 0 ו4, 1ו5, 2 ו6, 3,7)
תרגיל נחמד מאוד אולי מישהו ינסה לפתור בסיבוכיות יותר טובה
אסף התחיל לחפש עבודה כשהוא עדיין מתכנן את החזרה לישראל מחו"ל,
למרות ידע וניסיון רחב, הוא נתקל במחסומים לא הגיוניים כשניסה לחפש עצמאית.
חיפוש עבודה היא משימה, שעדיף לתת למישהו אחר לעשות עבורכם,
במיוחד כשאין לכם את הפניות לעשות את זה לבד,
במיוחד במיוחד כשאתם מודעים לערך שלכם בשוק, אבל לא מרגישים אותו בפועל.
לבדיקת התאמה
לפני 8 שנים
ע"י: 1_אורח_כללי
public static void update(double arr, int i, int j)
{
double dAverage = (arr + arr) / 2.0;
arr = dAverage;
arr = dAverage;
}
לעשות כמו בחיפוש בינארי, פיצול לשני חלקים ואז מקבלים את התשובה:
public static void MeanValue(double arr, int low, int high)
{
int mid = (low+high)/2;
if(low < mid)
{
for(int i = low; i <= mid; i++)
{
update(arr,i,high-i);
}
MeanValue(arr, mid+1,high);
MeanValue(arr,low, mid);
}
}
לפני 8 שנים
ע"י: 1_אורח_כללי
נראה לי שמצאתי פתרון תגידו לי מה דעתכם. אנחנו יודעים שהמערך בגודל 8 לכן נוכל לעבור עליו סהכ 3 פעמים ולבסוף נקבל את הממוצע שרצינו. זה הגיוני לפי החישוב הבא, אם ניקח מערך שאינו סדרה חשבונית כדי לטפל במקרה הכללי לדוגמה נוכל לחשב את הממוצע כך: (0+10)\2 = 5 , (7+5)\2 = 6, (11+15)\2 = 13, (10+4)\2 = 6 ואז בפעם השנייה נעבור על כל אחד מהזוגות: ((0+10)\2 + (7+5)\2) \2 = (7+5+0+10)\4 וכך הלאה עד שנגיע לממוצע של כל השמונה.
זאת המתודה שכתבתי:
//first pass
}(2=+for(int i = 0; i<7; i
{;(update(i, i+1
second pass//
}(for(int i = 0; i < 5; i+=4
;(update(i,i+2
{;(update(i+1, i+3
third pass//
}(++for(int i = 0; i < 4; i
{;(update(i, 8 - i - 1
ניתן לעשות את זה גם עם משחק יותר יפה של האינדקסים אבל לא התעכבתי על זה:)
לפני 8 שנים
ע"י: 1_אורח_כללי
מצאתי פיתרון לשאלה, בתנאי שהמערך שהתקבל הוא סדרה חשבונית.
במקרה הזה, על מנת ליצור מערך שמכיל את ממוצעו בכל אחד מהתאים, יש להעביר למתודה update את שני האינדקסים הקיצוניים במערך, בכל איטרציה.
ולכן:
public static void Main()
{
double[] arr = {1,2,3,4,5,6,7,8};
SetMeanValue(ref arr);
foreach(var val in arr)
{
Console.WriteLine(val);
}
}
public static void SetMeanValue(ref double[] arr)
{
for (int i = 0; i < arr.Length / 2; i++)
{
update(ref arr, i, arr.Length - (i+1));
}
}
לא מצאתי פיתרון למקרה כללי עבור כל מערך.
לפני 8 שנים
ע"י: ה_איש
היי חברים,
אשמח לשתף אתכם בשאלה לא פשוטה שנתקלתי בה בראיון עבודה שעשיתי לפני כשבועיים..
זה הולך ככה:
אתם צריכים לממש מתודה שמקבלת כפרמטר מערך מסוג double (המערך יהיה בגודל 8), והמתודה צריכה להחזיר את אותו המערך כאשר כל האיברים בו יכילו את הממוצע של המערך ההתחלתי שקיבלתם.
לדוגמא:
אם קיבלתם כפרמטר את המערך הבא:
הממוצע של המספרים הללו הוא 4.5 ולכן המערך שיוחזר הוא כזה:
חוקים:
- אתם לא יכולים לגשת ישירות לאיברי המערך (לא לקריאה ולא לכתיבה).
- הדרך היחידה שלכם לעדכן ערכים בתוך המערך היא להשתמש במתודה הבאה:
public void update(double[] arr, int i, int j)
{
double dAverage = (arr[i] + arr[j]) / 2.0;
arr[i] = dAverage;
arr[j] = dAverage;
}אין במתודה הזו שום קאטצ', היא פשוט מקבלת את המערך ו-2 מיקומים ושמה בשניהם את הממוצע של שניהם.
אם משהו לא מובן, אז תגידו ואנסה להסביר שוב.
אז.... רעיונות? מישהו?