היה לי היום ראיון אישי בצ'ק פוינט
הראיון התחיל בכך שסיפרתי על פרויקט שעשיתי בעבודה עד לכניסה לארכיטקטורה, תכנון ועיצוב.
לאחר מכן הייתה חידה:
לפניך 8 כוסות מים, כל אחת מלאה באופן שונה.
צריך להגיע למצב שבו בכל הכוסות יש כמות זהה של מים כשאתה יכול להעביר מים מכוס אחת לשנייה, כלומר אתה יכול להשתמש בפונקציה הבאה בלבד:
public void equals(double[] arr, int i, int j) {
arr[i] = arr[j] = (arr[i] + arr[j]) / 2;
}
הצלחתי בסופו של דבר לפתור את החידה, אך לא להגיע לקוד עובד. הפתרון הוא רקורסיבי כמובן בעל יעילות של n*log n.
מכיוון שניתן להשוות רק שני מספרים הפתרון עובד רק על מספרים שהם חזקה של 2.
מישהו מכיר את החידה או יכול לצרף קוד עובד שפותר את הבעיה?
ע"י: 1_אורח_כללי
שברתי על זה עכשיו את הראש קצת (לא הסתכלי עדיין על הפתרון שהביא זה מעלי)
בכל מקרה בדקתי את הפתרון שלי וראיתי שהוא עובד, הנה הוא לפניכם: (ניתן להחליף בין הסדר של הקריאה הרקורסיבית והcomperation כדי לשנות בין preorder,inorder,postorder)
public static void evenWater(double arr, int start, int stop) {
if ((stop - start) >= 1) {
evenWater(arr, (((stop + start) / 2) + 1), stop);
evenWater(arr, start, ((stop + start) / 2));
}
// comperation
int tempStart = start, tempStop = stop;
for (int i = 1; i <= (((stop - start)/2) + 1); i++) {
equals(arr, tempStart, tempStop);
tempStart++;
tempStop--;
}
//end of comperation
}
ע"י: 1_אורח_כללי
void Water (double arr[], int i, int j)
{
if (j<=i+1)
{
equals(arr,i,i+1);
}
else
{
int m = (j-i) /2;
Water (arr, i, i+m);
Water (arr, i+m+1, j);
int k = i+m + 1;
for (int l=i; l<=i+m; l++)
{
equals (arr, l, k);
k++;
}
}
}
ע"י: איחטיאנדר
אז מה הפתרון בעצם?
בונים סוג של עץ של השוואות מים?
כלומר, נניח במצב של 4 דליים.
משווים דלי 1 ו-2, מקבלים דליק שנקרא לו 12
משווים דלי 3 ו-4, מקבלים דליק שנקרא לו 34
משווים שלי 12 ו-34, מקבלים דלי 1234. זה בעצם הממוצע בכולם.
משווים את 1,2,3,4 ל1234?