תרגול מדעי המחשב

האם כל המספרים מוכלים בטווחים

מאתגר C#

המשימה

נתונה המחלקה Range — טווח, ולה שתי תכונות: low ו-high (שלמים, high >= low).
מספר x "מוכל" בטווח אם low <= x <= high.

נתונות שתי שרשרות:
• lst1 — שרשרת של מספרים שלמים, **ממוינת בסדר עולה**
• lst2 — שרשרת של טווחים, **ממוינת בסדר עולה** (ה-high של כל טווח קטן
  מה-low של הטווח שאחריו)

כתוב פעולה isIncluded שמחזירה true אם **כל** מספר ב-lst1 מוכל באחד
הטווחים ב-lst2.

דוגמה שמחזירה true:
  lst1: -9 → -8 → -7 → 12 → 14 → 15
  lst2: [-20,-10] → [-9,0] → [2,4] → [12,12] → [14,17]

דוגמה שמחזירה false:
  lst1: 1 → 5 → 8 → 12
  lst2: [-20,-10] → [-9,0] → [1,6] → [9,12] → [20,100]
  המספר 8 אינו מוכל באף טווח.

הנחיות:
• **זמן ריצה O(N)**, כאשר N הוא אורך השרשרת הארוכה. לולאה בתוך לולאה
  תיתן תשובה נכונה אבל לא תעמוד בדרישה.
• רמז: שתי השרשרות ממוינות. התקדמו על שתיהן במקביל עם שני מצביעים,
  והחליטו בכל צעד את מי לקדם.
• שתי השרשרות אינן null.

```ds:array
{"title":"lst1 בדוגמה המוכלת","items":["-9","-8","-7","12","14","15"]}
```

```ds:table
{"title":"lst2 בדוגמה המוכלת — כל מספר מוצא בית","rows":[["low","high"],["-20","-10"],["-9","0"],["2","4"],["12","12"],["14","17"]]}
```

```ds:array
{"title":"lst1 בדוגמה שאינה מוכלת — 8 נופל בין הטווחים","items":["1","5","8","12"]}
```

```ds:table
{"title":"lst2 בדוגמה שאינה מוכלת","rows":[["low","high"],["-20","-10"],["-9","0"],["1","6"],["9","12"],["20","100"]]}
```

קוד הפתיחה

using System;

class Range {
    private int low;
    private int high;

    public Range(int low, int high) { this.low = low; this.high = high; }

    public int  GetLow()          { return low; }
    public int  GetHigh()         { return high; }
    public void SetLow(int low)   { this.low = low; }
    public void SetHigh(int high) { this.high = high; }

    public override string ToString() { return "[" + low + "," + high + "]"; }
}

class Program {

    /** true אם כל מספר ב-lst1 מוכל באחד הטווחים ב-lst2. זמן ריצה O(N). */
    static bool IsIncluded(Node<int> lst1, Node<Range> lst2) {
        // כתוב את הפתרון כאן
        return false;
    }

    // ── עזר, לא חלק מהמשימה ──────────────────────────────────────────
    static Node<int> Nums(int[] v) {
        Node<int> h = null;
        for (int i = v.Length - 1; i >= 0; i--) h = new Node<int>(v[i], h);
        return h;
    }

    static Node<Range> Ranges(int[,] v) {
        Node<Range> h = null;
        for (int i = v.GetLength(0) - 1; i >= 0; i--)
            h = new Node<Range>(new Range(v[i, 0], v[i, 1]), h);
        return h;
    }

    static void Main() {
        Node<int>   a1 = Nums(new int[]{-9, -8, -7, 12, 14, 15});
        Node<Range> a2 = Ranges(new int[,]{{-20,-10}, {-9,0}, {2,4}, {12,12}, {14,17}});
        Console.WriteLine(IsIncluded(a1, a2));   // True

        Node<int>   b1 = Nums(new int[]{1, 5, 8, 12});
        Node<Range> b2 = Ranges(new int[,]{{-20,-10}, {-9,0}, {1,6}, {9,12}, {20,100}});
        Console.WriteLine(IsIncluded(b1, b2));   // False

        Node<int>   c1 = Nums(new int[]{50});
        Node<Range> c2 = Ranges(new int[,]{{1,10}, {20,30}});
        Console.WriteLine(IsIncluded(c1, c2));   // False — נגמרו הטווחים
    }
}

כדי לכתוב, להריץ ולקבל משוב — התחבר עם חשבון Google. לוקח שנייה.

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