עבור לתוכן

תקוע בתרגיל גאווה - Stack

Featured Replies

פורסם

התייאשתי, שבוע שלם להגשה ופשוט נתקעתי. 5 תרגילים, 4 עשיתי ואחד פשוט לא מצליח. אשמח שתעזרו לי.

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

איך לעזאזל אני עושה את זה? אני נשברתי כבר נפשית, ניסיתי הכל מהכל.

 

הקוד שלי נראה משהו כזה:

Stack<Integer> temp = new Stack<Integer>();
		int x = num;
		
		boolean flag = false;
		while (!s.isEmpty()) {
			if (s.top() == x % 10) {
				temp.push(s.pop());
				x /= 10;
				if (x == 0)
					flag = true;
			} else {
				temp.push(s.pop());
				x = num;
			}
		}
		x = num;
		while (!temp.isEmpty()) {
			if (temp.top() == x % 10) {
				s.push(temp.pop());
				x /= 10;
				if (x == 0)
					flag = true;
			} else {
				s.push(temp.pop());
				x = num;
			}

		}
		return flag;

 

פורסם

במחסנית יכולים להיות איברים נוספים חוץ מהספרות?

פורסם

ומה עושים עם כפילויות?

פורסם
  • מחבר
ציטוט של af db creid

ומה עושים עם כפילויות?

צריכים לבדוק גם אותם, ניקח לדוגמה את המחסנית 3,2,1,1,2 (ה2 הימני הוא הtop בעצם). במקרה הספציפי הזה, עם num=321 זה אמור להחזיר לנו true ומחזיר false. כשעשיתי את ההרצה, ברגע שהוא מגיע ל1 הראשון, הוא מתקיים ומוחק אותו, ולאחר מכן מגיע ל1 השני, הוא לא מתקיים ומוחק גם אותו.

ציטוט של af db creid

במחסנית יכולים להיות איברים נוספים חוץ מהספרות?

רק ספרות

פורסם

אז הדרך הקלה ביותר תהיה לחלץ את הספרות מהמספר (שורה אחת), ואז להשתמש בCollections.indexOfSubList כדי לקבוע אם הספרות מוכלות בstack. משהו כמו שלוש שורות :)

פורסם
  • מחבר
ציטוט של af db creid

אז הדרך הקלה ביותר תהיה לחלץ את הספרות מהמספר (שורה אחת), ואז להשתמש בCollections.indexOfSubList כדי לקבוע אם הספרות מוכלות בstack. משהו כמו שלוש שורות :)

לא למדנו על זה אז ככה שאני לא יכול להשתמש בזה.

אני חייב לעשות פה משהו עם מחסניות עזר ולולאות כדי למצוא הכל...

פורסם

אז בוא נכתוב את זה ידנית. יותר ארוך אבל לא נורא :)

לחלץ את הספרות ממספר לתוך collection כלשהו (שיהיה אפילו stack) אתה יודע?

פורסם
  • מחבר
ציטוט של af db creid

אז בוא נכתוב את זה ידנית. יותר ארוך אבל לא נורא :)

לחלץ את הספרות ממספר לתוך collection כלשהו (שיהיה אפילו stack) אתה יודע?

אני יכול לעשות בעצם כל עוד המספר שונה מ0, לקחת אותו %10 ולשים אותו בתוך מחסנית וכל פעם לחלק את המספר ב10, לא?

השאלה איך אני מתקדם מפה

פורסם

כן. יפה.

עכשיו, תכתוב את indexOfSubList. או גירסה קצת שונה שרק מחזירה כן\לא (containsSubList).

פורסם

אם אתה צריך רעיון איך נראה הפיתרון הכללי, הנה הגירסה שכתבתי תוך שימוש בפונקציות ה"אסורות":

import java.util.Stack;
import java.util.List;
import java.util.Collections;
import java.util.stream.Collectors;

public class Main
{
    private static boolean contained(int i, Stack<Integer> stack) {
        List<Integer> digits = String.valueOf(i)
            .chars()
            .map(Character::getNumericValue)
            .boxed()
            .collect(Collectors.toList());
        return Collections.indexOfSubList(stack, digits) != -1;
    }
    private static <T> Stack<T> asStack(T... items) {
        Stack<T> result = new Stack<T>();
        for (T item : items) {
            result.push(item);
        }
        return result;
    }
	public static void main(String[] args) {
	    System.out.println(contained(12345, asStack(0, 1, 2, 3, 4, 5, 6)));
	    System.out.println(contained(12345, asStack(0, 1, 2, 2, 3, 4, 5, 6)));
	    System.out.println(contained(122345, asStack(0, 1, 2, 2, 3, 4, 5, 6)));
	}
}

 

פורסם
  • מחבר
ציטוט של af db creid

אם אתה צריך רעיון איך נראה הפיתרון הכללי, הנה הגירסה שכתבתי תוך שימוש בפונקציות ה"אסורות":


import java.util.Stack;
import java.util.List;
import java.util.Collections;
import java.util.stream.Collectors;

public class Main
{
    private static boolean contained(int i, Stack<Integer> stack) {
        List<Integer> digits = String.valueOf(i)
            .chars()
            .map(Character::getNumericValue)
            .boxed()
            .collect(Collectors.toList());
        return Collections.indexOfSubList(stack, digits) != -1;
    }
    private static <T> Stack<T> asStack(T... items) {
        Stack<T> result = new Stack<T>();
        for (T item : items) {
            result.push(item);
        }
        return result;
    }
	public static void main(String[] args) {
	    System.out.println(contained(12345, asStack(0, 1, 2, 3, 4, 5, 6)));
	    System.out.println(contained(12345, asStack(0, 1, 2, 2, 3, 4, 5, 6)));
	    System.out.println(contained(122345, asStack(0, 1, 2, 2, 3, 4, 5, 6)));
	}
}

 

קודם כל מודה על העזרה. 

הבעיה היא שהקוד שלך ממש שונה מהקוד שלי, מבחינת מה מותר ומה אסור.

השימושים שלנו הם אך ורק בStack<Integer> s כלשהו, ובלולאות שהם while,for,if,switch,do-while וזהו.

שימוש בדברים אחרים אסורים עלינו. לכן זאת בעיה לזרום עם הקוד שלך, אתה מבין?

 

פורסם

הבנתי, זה רק להראות את הרעיון הכללי. הצלחת לממש את containsSubList?

פורסם

רגע, מותר לכם להשתמש בשתי stackים (עוד אחד חוץ מההוא הנתון)? או בlist?

פורסם
  • מחבר
ציטוט של af db creid

רגע, מותר לכם להשתמש בשתי stackים (עוד אחד חוץ מההוא הנתון)? או בlist?

מותר לנו להשתמש בעוד סטאק. זה בדיוק מה שאני עכשיו מנסה לעשות גם.

שיניתי קצת את הקוד, הגעתי לכאן:

public static boolean ex5(Stack<Integer> s, int num) {// o(n)
		Stack<Integer> temp = new Stack<Integer>();
		int x = num;
		Stack<Integer> temp1 = new Stack<Integer>();
		boolean flag = false;
		while (!s.isEmpty()) {
			if (!s.isEmpty() && s.top() == x % 10) {
				temp1.push(s.pop());
				x /= 10;
				if (x==0) 
					flag=true;
			} else if (temp1.isEmpty()) {
				temp.push(s.pop());
			} else {
				if(!temp1.isEmpty()) 
					temp.push(temp1.pop());
				x=num;
			}
		}
		x=num;
			while(!temp1.isEmpty())
			{
				s.push(temp1.pop());
			}
		while(!temp.isEmpty())
			s.push(temp.pop());
		return flag;
	}

 

פורסם

אין שום צורך בלהטוטי stack מסובכים. לStack יש פונקציה בשם elementAt שעושה בדיוק את מה שהשם שלה מרמז :)

ארכיון

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

דיונים חדשים