getLastIndexOf (int item) LinkedList

Hozir men o'zimning darslarim orqali, ham onlayn rejimida ma'lumotlar tuzilmalarini o'rganish bo'yicha ishlaydigan birinchi sinf o'quvchisi bo'ldim.

Men ham stack yangi, lekin u menga o'tmishda juda ko'p yordam berdi.

Hozirgi muammolarim ro'yxatda paydo bo'lgan so'nggi indeksni qaytarish uchun LinkedList orqali qidirishadi.

Bu o'z-o'zidan recursion bilan biroz harakat qilish kerakligini his qilyapman va shunga o'xshash narsalarni tekshirib ko'rishingiz mumkin, shuning uchun u bu elementning so'nggi paydo bo'lishi va keyin indeksini qaytarib berishi mumkin.

Ammo birinchi semestr Java kursi umuman yozilmagan edi va men yo'qotishdaman.

Ushbu kurslarda bo'lishimga to'g'ri javob berishni so'ramayman, men faqat bir yo'nalishga muhtojman. Yoki men o'zimning to'g'ri yo'lda ekanligimga ishonch hosil qilmoqchimisiz?

Bundan tashqari, hozirgi kunga qadar men bunga harakat qildim. Yordamingiz uchun tashakkur!

public int getLastIndexOf(int lastItem) { //goal is to return the lastindex at which that number appears last
    Node current;
    current = head;
    int count = 0; //count variable 
    while (current.next != null) { //go through list
        if (current.dataItem == lastItem) { 
            //check rest of the list for if that number exists beyond
        }
        count++; //increment count for every time loop executes
        current = current.next; //moves onto next node to check
    }
    return -1;
}
0
"O'qishni o'rganish uchun ba'zi manbalar bo'lishi mumkinmi?" o'quv qo'llanmalariga aloqasi yo'q, savol yopiq bo'ladi. Men siz uchun bu bitni olib tashlayman.
qo'shib qo'ydi muallif weston, manba
Bu bitta-bitta bog'langan ro'yxat, to'g'rimi? Agar u ikki tomonlama bog'liq bo'lsa, aniq echim oxiridan orqaga qarab qidirib toping.
qo'shib qo'ydi muallif David Conrad, manba
@Pansock Siz bu erda yangi bo'lganingizdan so'ng, iltimos, har qanday javob foydali ekanini topsangiz (siz o'zingizning dastlabki savollaringiz uchun) ovoz berishingiz mumkin va agar kimdir sizning savolingizga javob berganligini his qilsangiz, savolning yaqinida belgilab qo'yilgan belgini bosing bu javobni qabul qilish. Bu odamlar yozma javoblarni yozgan harakatlarni qadrlash usulidir
qo'shib qo'ydi muallif raghav710, manba
@Pansock Siz bu erda yangi bo'lganingizdan so'ng, iltimos, har qanday javob foydali ekanini topsangiz (siz o'zingizning dastlabki savollaringiz uchun) ovoz berishingiz mumkin va agar kimdir sizning savolingizga javob berganligini his qilsangiz, savolning yaqinida belgilab qo'yilgan belgini bosing bu javobni qabul qilish. Bu odamlar yozma javoblarni yozgan harakatlarni qadrlash usulidir
qo'shib qo'ydi muallif raghav710, manba
Ha, bir-biriga bog'langan ro'yxat
qo'shib qo'ydi muallif Pansock, manba
OK, yomonlik. Men bu erda yangi.
qo'shib qo'ydi muallif Pansock, manba

6 javoblar

Quyidagi o'xshash o'yinlarga ega bo'lsangiz, faqatgina saqlab qo'ying va indeksni qayta yozishingiz mumkin:

public int getLastIndexOf(int lastItem) { //goal is to return the lastindex at which that number appears last
    Node current;
    current = head;
    int count = 0; //count variable
    int lastIndex = 0;
    while (current.next != null) { //go through list
        if (current.dataItem == lastItem) { 
                lastIndex = count;
        }
        count++; //increment count for every time loop executes
        current = current.next; //moves onto next node to check
    }
return lastIndex;

Shunday qilib, o'yinning holatini lastIndeksda saqlab qolasiz va agar bir nechta o'yin bo'lsa, uni "oxirgi" qiymati bilan yozasiz.

1
qo'shib qo'ydi
Bu yondashuvga qaraganda yaxshiroq yechim va ishlaydi, lekin O'R rekursiya so'radi.
qo'shib qo'ydi muallif weston, manba
Bu sizning so'zingiz kabi qayta yoziladigan uchun juda yaxshi, lekin men uni yangi ma'lumotlar tuzilmalarini o'rganayotganda foydaliroq bo'lishini bilganim uchun uni rekursiv yondashuvdan olishga harakat qilaman. Ammo yordamni qadrlayman!
qo'shib qo'ydi muallif Pansock, manba

Quyidagi o'xshash o'yinlarga ega bo'lsangiz, faqatgina saqlab qo'ying va indeksni qayta yozishingiz mumkin:

public int getLastIndexOf(int lastItem) { //goal is to return the lastindex at which that number appears last
    Node current;
    current = head;
    int count = 0; //count variable
    int lastIndex = 0;
    while (current.next != null) { //go through list
        if (current.dataItem == lastItem) { 
                lastIndex = count;
        }
        count++; //increment count for every time loop executes
        current = current.next; //moves onto next node to check
    }
return lastIndex;

Shunday qilib, o'yinning holatini lastIndeksda saqlab qolasiz va agar bir nechta o'yin bo'lsa, uni "oxirgi" qiymati bilan yozasiz.

1
qo'shib qo'ydi
Bu yondashuvga qaraganda yaxshiroq yechim va ishlaydi, lekin O'R rekursiya so'radi.
qo'shib qo'ydi muallif weston, manba
Bu sizning so'zingiz kabi qayta yoziladigan uchun juda yaxshi, lekin men uni yangi ma'lumotlar tuzilmalarini o'rganayotganda foydaliroq bo'lishini bilganim uchun uni rekursiv yondashuvdan olishga harakat qilaman. Ammo yordamni qadrlayman!
qo'shib qo'ydi muallif Pansock, manba

Ro'yxatni quyruq deb nomlangan boshqa ro'yxatni ko'rsatadigan tugunni ko'rib chiqing. Bu pseudocode, ikki usulga e'tibor bering, private bir tugunni oladi, bu pastki ro'yxat.

public int getLastIndexOf(value) {
    return getLastIndexOf(head, value);
}

private int getLastIndexOf(sublist, value) {
    //check the tail first (because we want last index)
    if (sublist.tail != null) {//list has a tail
        int lastIndexInTail = getLastIndexOf(sublist.tail, value); //recursion
        if(lastIndexInTail != -1)
          return lastIndexInTail + 1; //it's in the sub list, the sub list starts at idx 1
    }

   //it's not in the tail, check this head
    if (sublist.data == value){
      return 0; //it's at the front of this list
    }

    return -1; //it's not in the head or in the tail of sublist
}
0
qo'shib qo'ydi
Xo'sh, agar siz to'ldirayotgan narsalarni olib ketsangiz, nima uchun savolni tahrirlayapsiz va kodni kiritmaysiz? Kimdir unga nima bo'lganligini ko'rsatishi mumkin.
qo'shib qo'ydi muallif weston, manba
Men shunga o'xshash narsalarni sinab ko'rdim, lekin mening mantiqim tufayli mashhur ketma-ketlikdagi ortiqcha xatolarni tashlab, o'z-o'zini recursiv funktsiyalar bilan ishlashni bilmasdim. Kelajakdagi xabarlarda nima qilishim kerakligi borasida yordam va yo'l-yo'riq ko'rsataman!
qo'shib qo'ydi muallif Pansock, manba

Ro'yxatni quyruq deb nomlangan boshqa ro'yxatni ko'rsatadigan tugunni ko'rib chiqing. Bu pseudocode, ikki usulga e'tibor bering, private bir tugunni oladi, bu pastki ro'yxat.

public int getLastIndexOf(value) {
    return getLastIndexOf(head, value);
}

private int getLastIndexOf(sublist, value) {
    //check the tail first (because we want last index)
    if (sublist.tail != null) {//list has a tail
        int lastIndexInTail = getLastIndexOf(sublist.tail, value); //recursion
        if(lastIndexInTail != -1)
          return lastIndexInTail + 1; //it's in the sub list, the sub list starts at idx 1
    }

   //it's not in the tail, check this head
    if (sublist.data == value){
      return 0; //it's at the front of this list
    }

    return -1; //it's not in the head or in the tail of sublist
}
0
qo'shib qo'ydi
Xo'sh, agar siz to'ldirayotgan narsalarni olib ketsangiz, nima uchun savolni tahrirlayapsiz va kodni kiritmaysiz? Kimdir unga nima bo'lganligini ko'rsatishi mumkin.
qo'shib qo'ydi muallif weston, manba
Men shunga o'xshash narsalarni sinab ko'rdim, lekin mening mantiqim tufayli mashhur ketma-ketlikdagi ortiqcha xatolarni tashlab, o'z-o'zini recursiv funktsiyalar bilan ishlashni bilmasdim. Kelajakdagi xabarlarda nima qilishim kerakligi borasida yordam va yo'l-yo'riq ko'rsataman!
qo'shib qo'ydi muallif Pansock, manba

Agar siz uni "recursion" orqali amalga oshirmoqchi bo'lsangiz

Ushbu qo'llanmada Topcoder bu erda foydali bo'lishi mumkin.

Mening 2 tentim quyidagicha:

O'zingizning muammoingizni hal qilish uchun rekursiya va iteratsiya (loop, shunga o'xshash va boshqalar) foydalanish mumkin.

Sizning joriy kodingiz yinelemeldir, u yinelemir. Recursion bir xil funktsiyani bir nechta tugash holatigacha qayta-qayta chaqirsangiz bo'ladi.

Retservis funktsiyasi ikki qismga ega:

  1. asosiy shart - bu sizning rekursioningizni qachon to'xtatishi kerakligini bildiradi.
  2. rekürsif holat - qachonki siz o'zingizning rekursiya qilishingizni aytsangiz

Buni misol bilan ko'rib chiqaylik. "Salom Dunyo" ni 10 marta chop qilmoqchimisiz. Mana buni qanday qilib amalga oshirishingiz mumkin

for(int i = 0; i < 10; i++){
   System.out.println("Hello World");
}

Va bu sizning takroriy tarzda qanday qilib amalga oshiriladi

void helloWorldPrinter(int index){
   //This is the base condition, tells us to stop when we've reached 10
   if(index == 10){
      return;
   }
   else{
      //Print for the n th hello world
      System.out.println("Hello World");
      //call the same function for printing the next (n+1 th) hello world
      helloWorldPrinter(index+1); //Looks similar to the i++ in the loop right?
   }
}

Recursion ikkilamchi daraxtlarda juda foydali bo'lib, ular pastki daraxtlarga o'xshash ma'lumotlar tarkibi hisoblanadi. Yinelemeli vs yinelemeli kod yozishni yodda tutishingiz mumkin bo'lgan kontseptsiya yineleyici, ma'lumotlar tuzilishiga kuzatuvchi sifatida qarash va unga amallar qilish kabi o'xshashlikdir. Reklama, ma'lumotlar strukturasi - siz o'zingizning ishingizni bajarasiz va keyingi elementga javob berishingiz kerak (keyingi rekordiv chaqiriq)

Endi ushbu mantiqni bog'langan ro'yxatdagi oxirgi elementni topish uchun kengaytirishga ishonaman. Buning uchun yineluvchi echim rekursivdan ko'ra osonroq bo'ladi.

Mantiq:

Loop over list (iterative or recursive)
  If element is found, note down the index
End Loop if list has been traversed completely
return the element index
0
qo'shib qo'ydi
@ Pansock baxtli o'rganish. Qo'shimcha ma'lumotlar tuzilmasi bilan bog'liq muammolar va echimlar uchun geeks uchun geeks ga murojaat qilishingiz mumkin.
qo'shib qo'ydi muallif raghav710, manba
Yinelemenin yineleyici ilmeklere qarshi qanday asosiy tushunchani olish bilan, albatta, yordam beradi. Yordamni qadrlayman.
qo'shib qo'ydi muallif Pansock, manba

Agar siz uni "recursion" orqali amalga oshirmoqchi bo'lsangiz

Ushbu qo'llanmada Topcoder bu erda foydali bo'lishi mumkin.

Mening 2 tentim quyidagicha:

O'zingizning muammoingizni hal qilish uchun rekursiya va iteratsiya (loop, shunga o'xshash va boshqalar) foydalanish mumkin.

Sizning joriy kodingiz yinelemeldir, u yinelemir. Recursion bir xil funktsiyani bir nechta tugash holatigacha qayta-qayta chaqirsangiz bo'ladi.

Retservis funktsiyasi ikki qismga ega:

  1. asosiy shart - bu sizning rekursioningizni qachon to'xtatishi kerakligini bildiradi.
  2. rekürsif holat - qachonki siz o'zingizning rekursiya qilishingizni aytsangiz

Buni misol bilan ko'rib chiqaylik. "Salom Dunyo" ni 10 marta chop qilmoqchimisiz. Mana buni qanday qilib amalga oshirishingiz mumkin

for(int i = 0; i < 10; i++){
   System.out.println("Hello World");
}

Va bu sizning takroriy tarzda qanday qilib amalga oshiriladi

void helloWorldPrinter(int index){
   //This is the base condition, tells us to stop when we've reached 10
   if(index == 10){
      return;
   }
   else{
      //Print for the n th hello world
      System.out.println("Hello World");
      //call the same function for printing the next (n+1 th) hello world
      helloWorldPrinter(index+1); //Looks similar to the i++ in the loop right?
   }
}

Recursion ikkilamchi daraxtlarda juda foydali bo'lib, ular pastki daraxtlarga o'xshash ma'lumotlar tarkibi hisoblanadi. Yinelemeli vs yinelemeli kod yozishni yodda tutishingiz mumkin bo'lgan kontseptsiya yineleyici, ma'lumotlar tuzilishiga kuzatuvchi sifatida qarash va unga amallar qilish kabi o'xshashlikdir. Reklama, ma'lumotlar strukturasi - siz o'zingizning ishingizni bajarasiz va keyingi elementga javob berishingiz kerak (keyingi rekordiv chaqiriq)

Endi ushbu mantiqni bog'langan ro'yxatdagi oxirgi elementni topish uchun kengaytirishga ishonaman. Buning uchun yineluvchi echim rekursivdan ko'ra osonroq bo'ladi.

Mantiq:

Loop over list (iterative or recursive)
  If element is found, note down the index
End Loop if list has been traversed completely
return the element index
0
qo'shib qo'ydi
@ Pansock baxtli o'rganish. Qo'shimcha ma'lumotlar tuzilmasi bilan bog'liq muammolar va echimlar uchun geeks uchun geeks ga murojaat qilishingiz mumkin.
qo'shib qo'ydi muallif raghav710, manba
Yinelemenin yineleyici ilmeklere qarshi qanday asosiy tushunchani olish bilan, albatta, yordam beradi. Yordamni qadrlayman.
qo'shib qo'ydi muallif Pansock, manba