3a3.1 שרשרת המוכלת בשרשרת אחרת
במשימה זו, עליכם לממש פעולה סטטית בשם IsSubList
במחלקת Solution
. פעולה זו תקבל שתי רשימות מקושרות (שרשרת חוליות) ותקבע האם הרשימה הראשונה (list1) היא רשימה חלקית של הרשימה השנייה (list2).
דרישות:
- שם הפעולה: isSubList
- קלט:
- list1: אובייקט מסוג Unit4.Node המייצג את ראש הרשימה המקושרת הראשונה.
- list2: אובייקט מסוג Unit4.Node המייצג את ראש הרשימה המקושרת השנייה.
- פלט: bool – תחזיר true אם list1 היא רשימה חלקית של list2, ו-false אחרת.
הגדרה של ‘רשימה חלקית’:
רשימה A
נחשבת ל’רשימה חלקית’ של רשימה B
אם קיים רצף של צמתים ב-B
שערכיהם זהים באופן רציף לכל הערכים ב-A
, ובאותו סדר.
- לדוגמה, הרשימה [1, 2, 3] היא רשימה חלקית של [5, 1, 2, 3, 4].
- רשימה ריקה (null) נחשבת תמיד לרשימה חלקית של כל רשימה אחרת (כולל רשימה ריקה).
הנחיות נוספות:
- הפעולה isSubList צריכה להיות סטטית (static).
- יש לטפל במקרים שבהם אחת או שתי הרשימות ריקות (כלומר, ראש הרשימה הוא null).
public static bool IsSubList(Node<int> list1, Node<int> list2)
{
// Implement your solution here
return false;
}
3a3.2 הפיכת רצפים זהים למופע יחיד
בתרגיל זה, עליכם לממש פעולה סטטית בשם RemoveSequencesOfIdenticalNumbers
בתוך מחלקה בשם Solution
. הפעולה תקבל כפרמטר ראש של רשימה מקושרת של מספרים שלמים ותשנה את הרשימה כך שכל רצף של איברים זהים יוחלף במופע בודד של האיבר. כלומר, אם יש רצף של מספרים זהים (לדוגמה, 1, 1, 1
), הוא יהפוך לאיבר בודד (1
).
הנחיות:
שם הפעולה: RemoveSequencesOfIdenticalNumbers
חתימת הפעולה: הפעולה לא צריכה להחזיר ערך (void), אלא לשנות את הרשימה המקושרת במקום.
התנהגות:
אם הרשימה ריקה או מכילה איבר בודד, אין לבצע שינוי. הפעולה צריכה לעבור על הרשימה ולזהות רצפים של איברים זהים. עבור כל רצף כזה, יש להשאיר רק את האיבר הראשון ברצף ולהסיר את כל האיברים הבאים הזהים לו.
דוגמה לשינוי רשימה:
קלט: 1 -> 1 -> 2 -> 3 -> 3 -> 3 -> 4 -> 5 -> 5 -> null
פלט: 1 -> 2 -> 3 -> 4 -> 5 -> null
public static void RemoveSequencesOfIdenticalNumbers(Node<int> head)
{
// Implement your solution here
}
3a3.3 הסרת כפילויות גנרי
ניתן לפתור קודם את link
בתרגיל זה, עליכם לממש פעולה בשם noDuply
שתקבל רשימה מקושרת ותסיר ממנה את כל האיברים הכפולים. כלומר, אם איבר מסוים מופיע מספר פעמים ברשימה, הוא יופיע פעם אחת בלבד לאחר הפעלת הפעולה. סדר האיברים שאינם כפולים צריך להישמר.
דרישות:
- שם הפעולה: NoDuply
- חתימה: הפעולה צריכה לקבל צומת ראשון (head) של רשימה מקושרת מסוג Unit4.Node ולהחזיר את הצומת הראשון של הרשימה המעודכנת.
- התנהגות:
- הפעולה צריכה להסיר את כל המופעים הכפולים של איברים, כך שכל איבר יופיע פעם אחת בלבד ברשימה הסופית.
- סדר הופעת האיברים הייחודיים צריך להישמר כפי שהופיעו לראשונה ברשימה המקורית.
- אם הרשימה ריקה (null) או מכילה איבר אחד בלבד, הפעולה צריכה להחזיר את הרשימה כמות שהיא.
###
public static Node<T> NoDuply<T>(Node<T> head){
// Implement your solution here
return head;
}
3a3.4 שרשור שתי שרשראות union
בתרגיל זה, עליכם לממש פעולה בשם ListsUnion
שתקבל שתי רשימות מקושרות ותחזיר רשימה מקושרת חדשה המהווה את איחוד האיברים משתי הרשימות המקוריות.
דרישות:
הפעולה צריכה להחזיר רשימה מקושרת חדשה המכילה את כל האיברים הייחודיים (ללא כפילויות) משתי הרשימות המקוריות. אין חשיבות לסדר האיברים ברשימה המוחזרת. אין למיין את הרשימות המקוריות או את רשימת האיחוד.
קלט:
- list1: ראש הרשימה המקושרת הראשונה יכולה להיות null אם הרשימה ריקה.
- list2: ראש הרשימה המקושרת השנייה יכולה להיות null אם הרשימה ריקה.
פלט:
- ראש רשימה מקושרת חדשה המכילה את איחוד האיברים הייחודיים משתי הרשימות המקוריות. אם שתי הרשימות המקוריות ריקות, הפלט יהיה null.
public static Node<int> ListsUnion(Node<int> list1, Node<int> list2)
{
// Implement your solution here
return null;
}
3a3.5 intersect חיתוך שרשראות (במשמעות המתמטית)
תיאור המשימה
עליכם לממש פעולה סטטית בשם ListsIntersection
במחלקה Solution
. פעולה זו תקבל שתי רשימות מקושרות ותחזיר רשימה מקושרת חדשה המכילה את האיברים המשותפים לשתי הרשימות המקוריות, ללא כפילויות.
דרישות:
- ללא כפילויות: רשימת התוצאה לא צריכה להכיל ערכים כפולים, גם אם הם מופיעים מספר פעמים ברשימות המקוריות.
- סדר האיברים: סדר האיברים ברשימת התוצאה אינו חשוב.
public static Node<int> ListsIntersection(Node<int> list1, Node<int> list2)
{
// Implement your solution here
return null;
}
3a3.6 ספירת רצפים ממוינים
בתרגיל זה, עליכם לממש פעולה בשם CountSequences
שתקבל רשימת מספרים ותחזיר את מספר הרצפים המונוטוניים ברשימה.
הגדרות
- רצף ממוין: רצף של שלושה מספרים (חיוביים) לפחות, הממוינים בסדר עולה או יורד. מספרים שווים (לדוגמה, [4, 4, 5]) נחשבים כחלק מרצף ממוין אם הם שומרים על כיוון המיון (עולה במקרה זה).
- רשימת רצפים: רשימה של מספרים, כאשר המספר 0 מפריד בין רצף לרצף. כלומר, ברגע שנתקלים ב-0, הרצף הנוכחי מסתיים, ורצף חדש יכול להתחיל אחריו.
דרישות
כללים נוספים:
- רצף חייב להיות באורך של 3 מספרים חיוביים לפחות.
- המספר 0 משמש כמפריד רצפים. הוא אינו נחשב חלק מרצף ואינו נכלל בבדיקת המיון או באורך הרצף. הוא רק מאפס את המונה של הרצף הנוכחי.
- רצף יכול להיות ממוין עולה בלבד או יורד בלבד. לדוגמה, [1, 2, 3] הוא רצף עולה, [5, 4, 3] הוא רצף יורד. [1, 3, 2] אינו רצף ממוין.
- מספרים חיוביים בלבד נכללים ברצפים. כלומר, אם יש מספרים שליליים, הם אינם חלק מרצף ממוין ואינם נספרים.
public static int CountSequences(Node<int> head)
{
// Implement your solution here
return 0;
}
דוגמאות
דוגמה 1: רשימה עם מספר רצפים
קלט (ייצוג רשימה מקושרת):[1, 2, 3, 0, 4, 4, 5, 1, 0, 5, 0, 1, 2, 0, 3, 2, 1, 0, 4, 3, 2, 1]
פלט צפוי:3
- הסבר:
- הרצף הראשון: [1, 2, 3] (ממוין עולה, אורך 3) - נספר.
- הקטע [4, 4, 5, 1] אינו רצף ממוין (4,4,5 עולה, אבל 5,1 יורד).
- הקטע [5] אינו רצף ממוין (אורך 1).
- הקטע [1, 2] אינו רצף ממוין (אורך 2).
- הרצף השני: [3, 2, 1] (ממוין יורד, אורך 3) - נספר.
- הרצף השלישי: [4, 3, 2, 1] (ממוין יורד, אורך 4) - נספר.
דוגמה 2: רשימה ללא רצפים ממוינים
קלט:[1, 5, 2, 0, 8, 7, 9, 0, 3, 1]
פלט צפוי:0
דוגמה 3: רשימה עם רצף בודד
קלט:[10, 20, 30, 40, 0, 5, 4, 3]
פלט צפוי:1
- הסבר:
- הרצף הראשון: [10, 20, 30, 40] (ממוין עולה, אורך 4) - נספר.
- הקטע [5, 4, 3] הוא רצף ממוין יורד, אבל הוא מופיע אחרי ה-0 השני, ולכן לא נספר כחלק מהרצף הראשון. אורך 3, נספר.
- הדוגמה המקורית מהשאלה היא [1,2,3,0,4,4,5,1,0,5,0,1,2,0,3,2,1,0,4,3,2,1] והפלט הוא 3. בדוגמה זו, [4,4,5,1] אינו רצף ממוין כי יש בו גם עליה וגם ירידה, וגם [5] ו-[1,2] קצרים מדי. לכן, רק [1,2,3], [3,2,1] ו-[4,3,2,1] נספרים. הפלט 3 הוא נכון.
דוגמאות
דוגמה 1: רשימה עם מספר רצפים
קלט (ייצוג רשימה מקושרת):[1, 2, 3, 0, 4, 4, 5, 1, 0, 5, 0, 1, 2, 0, 3, 2, 1, 0, 4, 3, 2, 1]
פלט צפוי:3
- הסבר:
- הרצף הראשון: [1, 2, 3] (ממוין עולה, אורך 3) - נספר.
- הקטע [4, 4, 5, 1] אינו רצף ממוין (4,4,5 עולה, אבל 5,1 יורד).
- הקטע [5] אינו רצף ממוין (אורך 1).
- הקטע [1, 2] אינו רצף ממוין (אורך 2).
- הרצף השני: [3, 2, 1] (ממוין יורד, אורך 3) - נספר.
- הרצף השלישי: [4, 3, 2, 1] (ממוין יורד, אורך 4) - נספר.
דוגמה 2: רשימה ללא רצפים ממוינים
קלט:[1, 5, 2, 0, 8, 7, 9, 0, 3, 1]
פלט צפוי:0
דוגמה 3: רשימה עם רצף בודד
קלט:[10, 20, 30, 40, 0, 5, 4, 3]
פלט צפוי:1
- הסבר:
- הרצף הראשון: [10, 20, 30, 40] (ממוין עולה, אורך 4) - נספר.
- הקטע [5, 4, 3] הוא רצף ממוין יורד, אבל הוא מופיע אחרי ה-0 השני, ולכן לא נספר כחלק מהרצף הראשון. אורך 3, נספר.
- הדוגמה המקורית מהשאלה היא [1,2,3,0,4,4,5,1,0,5,0,1,2,0,3,2,1,0,4,3,2,1] והפלט הוא 3. בדוגמה זו, [4,4,5,1] אינו רצף ממוין כי יש בו גם עליה וגם ירידה, וגם [5] ו-[1,2] קצרים מדי. לכן, רק [1,2,3], [3,2,1] ו-[4,3,2,1] נספרים. הפלט 3 הוא נכון.
3a3.7 פלינדרום ברשימה מקושרת
בתרגיל זה, עליכם לממש פעולה סטטית בשם IsPalindrome
בתוך מחלקה בשם Solution
. הפעולה תקבל כפרמטר ראש של רשימה מקושרת ותחזיר ערך בוליאני (true
או false
) המציין האם הרשימה המקושרת מהווה פלינדרום.
דרישות נוספות:
- יש להתייחס למקרים הבאים:
- רשימה ריקה.
- רשימה עם איבר אחד.
- הפעולה צריכה להיות יעילה ככל האפשר מבחינת זמן וזיכרון.
public static bool isPalindrome(Node<int> head)
{
// Implement your solution here
return false;
}
3a3.8 מיון לפי זוגיות בשרשרת
בתרגיל זה, עליכם לממש פעולה בשם ParityPartition
במחלקה Solution שתקבל רשימה מקושרת של מספרים שלמים ותשנה את סדר איבריה בהתאם לזוגיות.
דרישות:
- לוגיקה:
- קבעו את הזוגיות של האיבר הראשון ברשימה המקורית. זו תהיה ה’זוגיות הראשית’.
- סדרו מחדש את הרשימה כך שכל האיברים בעלי ה’זוגיות הראשית’ יופיעו בתחילת הרשימה.
- אחריהם, יופיעו כל האיברים בעלי הזוגיות הנגדית.
- חשוב: הסדר היחסי של האיברים בתוך כל קבוצת זוגיות (זוגיות ראשית וזוגיות נגדית) חייב להישמר כפי שהיה ברשימה המקורית.
- מבנה נתונים: כל הפעולות חייבות להשתמש במבנה הנתונים Unit4.Node המייצג שרשרת חוליות.
הנחיות נוספות:
- עליכם לטפל במקרה שבו הרשימה ריקה או מכילה רק איבר אחד.
- הפתרון צריך להיות יעיל ככל האפשר מבחינת זמן ריצה וזיכרון.
- אין להשתמש במבני נתונים נוספים מלבד Unit4 (לדוגמה, אסור להשתמש במערכים או רשימות רגילות כדי לאחסן את האיברים באופן זמני).
public static void ParityPartition(Node<int> head)
{
// Implement your solution here
}