עבור לתוכן

שאלה - מערכים בג'אווה

Featured Replies

פורסם

· כתוב מתודה אשר מקבלת את מערכים A ו B , בודקת אם A מוכל שלא ברצף ב B. המתודה מחזירה משתנה בוליאני בערך מתאים לתוצאת הבדיקה.


public static boolean CheckContainment(int a[], int b[]){
int count = 0;


for(int i = 0; i<a.length; i++){
for (int k = 0; k<b.length; k++){
if(b[k] == a[i]){
count++;
break;
}
}
}
if (count == a.length){
return true;
}
return false;

עכשיו הבעיה היא למשל אם מערך A הוא למשל (1,2,2,3) ומערך B הוא (1,2,3,4) זה עדין יתן לי TRUE מכיוון שהמספר 2 מופיע במערך B, אבל אני צריך שהוא יופיע שם פעמיים...

אשמח לעזרה

פורסם

אתה צריך "לזכור" באיזה ערך כבר השתמשת. למשל עם שימוש במערך עזר.

פורסם
  • מחבר

הבנתי למה התכוונת, לא מצליח כ"כ לעשות את זה בפועל.

האם תאכל לחדד?

פורסם

תחשוב על ההגדרה של k.

אם תגדיר אותו במקום אחר, ולא בלולאה, זה יעזור לך?

פורסם

^לא כ"כ הבנתי למה אתה מתכוון, הרי K הוא אינדקס של הלולאה.

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

פורסם

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

פורסם

עכשיו כשאני קורא שוב את השאלה, יכול להיות שהוא התכוון שאם a הופיע לפני b במערך A הוא יופיע כך גם ב-B.

במקרה הזה K יקודם עד שהתו ימצא ובאיטרציה הבאה ימשיך משם.

פורסם
  • מחבר

בסופו של דבר מה שעשיתי זה הרצתי בדיקות על שתי המערכים , מצאתי את המספר הכי גדול מבין שניהם והגדרתי אותו כ temp

כאשר בלולאה שמשווה איברים , נצמא איבר זהה, הוא מחליף אותו ב temp+1 - מספר שבטוח לא יופיע באף מערך.

ככה הכל עובד כמו שצריך :)



public static boolean CheckContainment(int a[], int b[]){
int count = 0;
int temp = b[0];

for (int j = 1; j<b.length; j++) {
if (b[j] > b[j-1]){
temp = b[j];


}
}
for (int y = 0; y<a.length; y++){
if (temp < a[y]){
temp = a[y];


}
}
for(int i = 0; i<a.length; i++){
for (int k = 0; k<b.length; k++){
if(b[k] == a[i]){
count++;
b[k] = temp+1;
break;
}
}
}
if (count == a.length){
return true;
}
return false;
}


פורסם

פתרון יפה ויצירתי (לקח לי דקה להבין מה עשית ולמה).

עם זאת כמה דברים חשובים:

1. כמדומני, בג'אווה, העברת מערכים כפרמטר למתודה דינה כהעברת אובייקט כפרמטר. משמע, כל שינוי שתעשה במערך (החלפת איברים בtemp+1) תשמר גם אחרי שהמתודה תסתיים. אתה צריך להזהר בדברים כאלה בתכנות. אם יהיה שימוש נוסף במערכים הללו בתוכנית, התוכנית תיפול. שוב, אין פסול בפתרון שלך, אבל בפתרון שבו יש צורך להחליף ערכים במערך תשתמש במערך עזר שהוא העתק של המערך המקורי.

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

פורסם
  • מחבר

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

ארכיון

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

דיונים חדשים