עבור לתוכן

שאלה בג'ווה

Featured Replies

פורסם

עליכם לכתוב שיטה, המוצאת את החלק הזהה הארוך ביותר בין שתי רשימות.

השיטה מקבלת כפרמטרים שתי רשימות מקושרות חד סטריות (כל רשימה נתונה על-ידי Element שהוא תחילת הרשימה), אשר בכל אחת מהן האיברים ממוינים בסדר עולה ממש (אין איברים זהים).

ערך ההחזרה של השיטה הוא מסוג Element, אשר התכונה _number שלו מכילה את אורך החלק הזהה, והתכונה _next שלו מכילה את האיבר הראשון (באחת מן הרשימות) בחלק הזהה.

אין לסרוק את הרשימות הנתונות (כל אחת מהן) יותר מפעם אחת!

דוגמא:

רשימה א' 1->2->4->6->8->10->15->null

רשימה ב' 2->4->8->10->15->null

הערך המוחזר יכיל את המספר 3 ואיבר ה-_next שלו יהיה האיבר שערכו המספרי הוא 8. (החלק הזהה הארוך ביותר הוא זה המתחיל באיבר שמספרו 8, ולאחריו האיברים שמספריהם 10 ו-15, סה"כ 3 איברים).

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

פורסם

מה זה משנה כמה איברים יש?

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

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

פורסם
  • מחבר

הנה הקוד שכתבתי , אני לא מצליח לעלות על הטעות

הנה הקוד

public class Element{
private int _number;
private Element _next;

public Element(int number) {
_number = number;
_next = null;
}

public Element(int number , Element next ) {
_number = number;
_next = next;
}

public int getNumber()
{return _number;}

public Element getNextElement()
{return _next;}

public static Element rett(Element e1 , Element e2)
{
Element a1= e1;//pointer to the "head" of e1
Element a2 = e2; //pointer to the "head" of e2
Element tempCount = new Element (0);
int count = 0;
int currLong = 0;
Element curr = new Element(0);

while (a1.getNextElement() != null && a2.getNextElement() !=null)
{
if (a1.getNumber() < a2 .getNumber() )
{
a1=a1.getNextElement();
}

else if(a1.getNumber() == a2.getNumber())
{
if(count ==0)
{
// temp._number =count ;
tempCount. _next =a1;
}
count++ ;
a1= a1.getNextElement();
a2= a2.getNextElement();
}

else
{
a2=a2.getNextElement();
}


if(count>currLong)
{
curr._number = count;
curr._next =tempCount;
}
}
return curr;
}
}

והנה הMAIN שאני מריץ איתו

public class main
{
public static void main (String [] args)
{
Element p1 = new Element( 1 , new Element (2, new Element (4 ,new Element(6 , new Element(8,new Element(10 , new Element(15)))))));

Element p2 = new Element ( 2 , new Element(4,new Element(8 , new Element (15))) );

System.out.println(Element.rett(p1 , p2));
}
}

פורסם

עריכה :

זה כל המחלקה

 public class Element
{
private int _number;
private Element _next;

public Element(int number)
{
_number = number;
_next = null;
}

public Element(int number , Element next )
{
_number = number;
_next = next;
}

public int getNumber()
{
return _number;
}

public Element getNextElement()
{
return _next;
}
public void setNumber(int num)
{
_number=num ;
}
public void setNext(Element next)

{
_next =next;
}
public Element getLongest (Element first , Element second )
{
int count=0 ,longest=0;
Element result =new Element(0) ;
while ( first != null && second !=null)
{
if (first.getNumber() != second.getNumber())
{
if (first.getNumber ( ) > second.getNumber( ) )
second = second.getNextElement () ;
else
first = first.getNextElement() ;
count = 0;
}
else
{
count++;
if (count >longest)
{

longest= count;
if (longest==1)
result.setNext(first);

}
}
}
result.setNumber(longest) ;
return result ;
}
}

פורסם
  • מחבר

תודה על ההשקעה , אבל יש טעות בקוד! הוא נכנס ללואה אין שופית בקטע של ה IF-ELSE בתוך ה WHILE !!!

פורסם

צודק .

נסה את זה

public class Element
{
private int _number;
private Element _next;

public Element(int number)
{
_number = number;
_next = null;
}

public Element(int number , Element next )
{
_number = number;
_next = next;
}

public int getNumber()
{
return _number;
}

public Element getNextElement()
{
return _next;
}
public void setNumber(int num)
{
_number=num ;
}
public void setNext(Element next)

{
_next =next;
}
public Element getLongest (Element first , Element second )
{
int count=0 ,longest=0;
Element result =new Element(0) ;
while ( first != null && second !=null)
{
if (first.getNumber() != second.getNumber())
{
if (first.getNumber ( ) > second.getNumber( ) )
second = second.getNextElement () ;
else
first = first.getNextElement() ;
count = 0;
}
else
{
count++;
if (count >longest)
{

longest= count;
if (longest==1)
result.setNext(first);
}
second = second.getNextElement();
first = first.getNextElement();
}

}
result.setNumber(longest) ;
return result ;
}
}

פורסם
  • מחבר

פה אני מקבל בדיוק את אותה תשובה כמו בקוד שלי , אני מקבל את הכתובת של אחד ה "Element"

פורסם

לא הבנתי , אבל המתודה אמורה להחזיר Element מה הבעיה ?

אם אתה רוצה להדפיס את _number תעשה getNumber לאלמנט [br]פורסם בתאריך: 15.03.2008 בשעה 19:58:26


תפעיל את ה MAIN הזה ותראה שזה עובד

public class main
{
public static void main (String [] args)
{
Element p1 = new Element( 1 , new Element (2, new Element (4 ,new Element(6 , new Element(8,new Element(10 , new Element(15)))))));

Element p2 = new Element ( 2 , new Element(4,new Element(8 , new Element (15))) );

System.out.println(p2= Element.getLongest(p1 , p2));
System.out.println(p2.getNumber());
}
}

פורסם
  • מחבר

את השיטה שכתבת שיניתי לשיטה סטטית ואת ההדפסה ביצעתי

System.out.println(Element.getLongest(p1 , p2));

ואז במקום לקבל 3 ו 8 קיבליתי "Element@39e5b5"

פורסם

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

פורסם

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

System.out.println(Element.getLongest(p1 , p2).getNumber());

פורסם

ותשים לב נאו אתה העתקת את הרשימות מהדוגמא בשאלה המקורית

אבל חיסרת 10 ברשימה השניה לכן התוצאה היא לא אותו דבר כמו בשאלה

ככה אתה רשמת

Element p1 = new Element( 1 , new Element (2, new Element (4 ,new Element(6 , new Element(8,new Element(10 , new Element(15)))))));

Element p2 = new Element ( 2 , new Element(4,new Element(8 , new Element (15))) );

וככה זה בשאלה

רשימה א' 1->2->4->6->8->10->15->null

רשימה ב' 2->4->8->10->15->nul

שים לב שחיסרת 10 ברשימה השניה שלך לכן זו לא אותה תוצאה כמו בדוגמא

פורסם
  • מחבר

אהההה אוקיי.....תודה רבה על הסברים , קצת הסתבכתי עם עצמי פה !!!

:xyxthumbs:

פורסם

יש באג קריטי בתוכנית שלי , זאת המתודה התוקנת

 public static Element getLongest (Element first , Element second )
{
int count=0 ,longest=0;
Element result =new Element(0) ;
Element t =new Element(0);
while ( first != null && second !=null)
{
if (first.getNumber() != second.getNumber())
{
if (first.getNumber ( ) > second.getNumber( ) )
{
second = second.getNextElement () ;
count =0;
}
else
{
first = first.getNextElement() ;
count = 0;
}
}
else
{

count++;
if (count==1)
t=first ;
if (count >longest)
{

longest= count;

result.setNext(t);
}
second = second.getNextElement();
first = first.getNextElement();
}

}
result.setNumber(longest) ;
return result ;
}
}

ארכיון

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

דיונים חדשים