3 תשובות
זה מאוד כללי, אפשר לעשות את זה בשלל דרכים וזה תלוי מה את בדיוק רוצה.

האם את ממשת את זה במחלקה עצמה? ואז המימוש הקונקרטי יהיה רלוונטי לאלגוריתם.
או שאת רוצה לממש את זה מבחוץ עם ה2/3 מטודודות בסיסיות יחידות שממומשות לך במחלקות.
ובכל אחד מהמקרים, במידה וקיימת כפילות, איך את רוצה למחוק את המופעים? לפי מה? קודם את מוחקת את המופעים ה"מאוחרים" או ה"מוקדמים"?

השאלה שלך קצת כללית מדי בשביל שאוכל לתת תשובה מסויימת.
שואל השאלה:
סיבכת אותי ממש , רוצה את זה כפעולה חיצונית סטטית , שפשוט לא יופיע המספר פעמיים לא משנה כלכך המאוחרים או המוקדמים
אוקיי, הייתי שואל עוד שאלות לגבי ההגבלות של המטלה הזאת. אבל זה סתם יסבך.

אם את רוצה להשתמש בהכרח באותו סוג נתונים d(מחסנית או תור, יהיה אשר יהיה), את יכולה לעשות את הדבר הבא:

נתון לך אובייקט x מסוג d.
את מגדירה אובייקט y מסוג d.
עבור i גדל מ1 את מבצעת את הלולאה הבאה:
תחילת לולאה.
מוציאה i-1 איברים מx ומכניסה אותם לפי סדר ההוצאה לתוך y.
אם x התרוכן, את מחזירה את האיברים מy לx לפי הסדר, ומסיימת את הלולאה.
את מוציאה איבר a מx ומכניסה אותו לy.
את מוציאה את כל שאר האיברים בx ומכניסה כל אחד מהם לפי הסדר לy רק אם הוא שונה מa.
את מחזירה לפי הסדר את כל האיברים מ y לx.
סוף לולאה.

בסוף האלגוריתם, x הנתון יכיל את האיברים המקוריים שהיו בו, ללא חזרות וישמר הסדר כאשר המופעים המאוחרים הם אלה שיוצאים.


וזה יעבוד בין אם d זה סוג מחסנית ובין אם זה סוג תור.



אם מותר היה לך להוציא את האיברים לתוך מערך, היית יכולה לעשות את זה טיפה יותר ביעילות (אבל אותה סיבוכיות זמן אסימפטוטית).
ואם הסדר לא חשוב בכלל, אז בכלל היית יכולה לעשות את זה בזמן nlogn (במקום n בריבוע).
באותו הנושא: