תקוע בתרגיל גאווה - Stack - תכנות - HWzone פורומים
עבור לתוכן
  • צור חשבון

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


maor18
 Share

Recommended Posts

התייאשתי, שבוע שלם להגשה ופשוט נתקעתי. 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

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

רק ספרות

קישור לתוכן
שתף באתרים אחרים

ציטוט של af db creid

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

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

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

קישור לתוכן
שתף באתרים אחרים

ציטוט של af db creid

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

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

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

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

קישור לתוכן
שתף באתרים אחרים

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

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 וזהו.

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

 

קישור לתוכן
שתף באתרים אחרים

ציטוט של 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;
	}

 

קישור לתוכן
שתף באתרים אחרים

הצטרפ/י לדיון

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

אורח
הוסף תגובה

×   התוכן שהודבק הוא עם עיצוב.   הסר עיצוב

  Only 75 emoji are allowed.

×   הקישור שלך הוטמע אוטומטית.   הצג כקישור רגיל

×   התוכן הקודם שלך שוחזר אוטומטית.   נקה הכל

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
  • צור חדש...