נשלח בתאריך: 30 December 2007 בשעה 11:01 | | IP רשוּם
|
|
|
|
יש פתרון מאד פשוט, הוא מצריך שני משתנים נוספים בלבד (אינדקסים של מיקומים במערך, מצביעים): רצים בלולאה על המערך עד שמגיעים למקום הראשון שיש בו אפס (מקדמים את שני המשתנים לשם), זה יכול להיות גם המקום הראשון במערך. משתנה אחד נשאר להצביע על אותו מקום (המכיל אפס) והמשתנה השני מתקדם למקום הראשון הבא ששונה מאפס. את התוכן של של המקום במערך אליו מצביע המשתנה השני (שהתקדם למקום ששונה מאפס) מעבירים לתא אליו מצביע המשתנה הראשון (שעד עכשיו היה בו אפס) ובמקומו שמים אפס.
שימו לב שבכל זמן נתון, בהכרח בתחילת המערך יהיו רק איברים שונים מ-0: במקרה שהמצביע הראשון "נשאר" בתחילת המערך (כי היה 0 כבר במקון הראשון), ברגע שהוא קיבל את התוכן מהמשתנה השני אז יש בהתחלה איבר שונה מ-0. במקרה שהמצביע הראשון הצביע על איבר 0 הראשון אחרי כמה איברים שונים מ-0, ברגע שהוא קיבל את התוכן מהמשתנה השני שוב נשמר רצף האיברים השונים מ-0.
כעת מקדמים את המצביע הראשון במקום אחד בלבד, כי ברור שהתא הבא יכיל אפס: אם המצביע השני "רץ" קדימה אחרי שורה של אפסים, זאת אומרת שיש לפנינו הרבה אפסים ובפרט האיבר הקרוב הוא 0. אם המצביע השני לא "רץ" קדימה אלא הצביע למקום הבא – והוא תמיד יהיה לפחות במקום אחד לפני הראשון כי הראשון נשאר על איבר 0 והשני מחפש איבר ששונה מאפס - אז מעצם העברת התוכן שעשינו כעת יש בו בהכרח 0. למצביע השני נותנים להמשיך עם הלולאה לחפש איברים ששונים מ-0. מעצם התנאי שלו ברור שמאחוריו יש אפסים וכעת גם האיבר שעליו הוא הצביע – שהיה עד עכשיו שונה מ-0 – הפך כעת להיות 0, לכן הבדיקה צריכה להתחיל מהמקום הבא והלאה. כשמוצאים איבר ששונה מ-0 מבצעים את אותן פעולות וחוזר חלילה.
ההסבר ארוך אבל הביצוע פשוט מאד... בהצלחה
|