עבור לתוכן

צריך עזרה , איך הקוד הבא עובד

Featured Replies

פורסם


public static int countArray(int []_arr){
int sign=_arr[0]+1;
int count=0;
boolean found=false;
int start=_arr[0];

for (int i=1; !found; i=((i+1)%_arr.length)){
count++;
if (_arr[i]==start){
_arr[i]=sign; //mark this place
if (_arr[(i-count)%_arr.length]==_arr[i])
found=true;
else _arr[i]=sign;

}
}
return count;
}

מה שהקוד הזה אמור לעשות הוא בעצם להחזיר את הגודל של המערך בשיטה הבאה

: ע"מ לדעת כמה מכוניות יש בחניון (או כמה איברים יש ברשימה המקושרת/מערך) נתחיל ממכונית כל שהיא ונזכור את המספר שלה עכשיו נתחיל לספור מכוניות אם נגיע למכונית שמסומנת כמו המספר של הראשונה (שאולי זו בדיוק היא) אז נבצע שני דברים הראשון נשנה את הסימן שעל המכונית לאיזהוא מספר (flag) ונזכור את המונה עכשיו נבדוק האם כשחוזרים אחורה את מספר הצעדים שיש במונה מגיעים למכונית עם הflag אם כן אז סיימנו ומספ' המכוניות הוא כמספר שמונה. אם לא אז מבצעים שוב (עכשיו כשנגיע למכונית שנעצרנו בפעם הראשונה לא נעצר בה כי אין בה מספר כמו שיש למכונית שממנה אנו מתחילים לספור כי שינינו אותו ל-flag [כמובן שה-flag צריך להיות שונה מהמספר שיש על המכונית הראשונה]). הסיבוכיות היא O(n^2) כי במקרה בגרוע כל המכוניות מסומנות באותו סימן ולכן בכל מכונית נגיע אליה ונחזור חזרה (כלומר לכל n במכוניות נבצע בדיקה חזור של n בדיקות אחורה(

מישהו יכול להסביר לי בדיוק איך זה עושה את זה? תודה..

פורסם

מה שקורה זה הדברים הבאים:

1. ערך האיבר הראשון נשמר במשתנה start וערך האיבר השני במשתנה sign.

2. הלולאה רצה איבר איבר, כאשר i=((i+1)%_arr.length מבטיח לך שאם הגעת לסוף המערך, הצעד הבא יחזור לאיבר הראשון (האפס).

3. נעשית בדיקה של השוואת ערך האיבר הנוכחי לערך האיבר הראשון.

4. אם זה מתקיים מציבים את הערך sign באותו איבר.

5. כעת בודקים אם האיבר [(_arr[(i-count)%_arr.length שהוא למעשה האיבר הראשון שווה לאיבר הנוכחי. האיבר הנוכחי הוא בדיוק האיבר שהצבנו בו את sign בשלב 4. לכן, אם הם שווים זה אומר ששינינו למעשה את איבר 1 ואפשר להחזיר את הערך של count.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים