Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Lefti

Jak przełożyć C++ na Java

Rekomendowane odpowiedzi

Witam.

 

Chciałbym przełożyć jeden z programów z C++ na Javę. Napotkałem pewną trudność która zapewne jest oczywista, ale jestem mało doświadczony.... :(

 

Program jest jedną z implementacji rozwiązania zadania "Litery" z XIX olimpiady informatycznej:

 

https://oi.edu.pl/l/19oi_ksiazeczka/

 

Oto kod interesującej mnie implementacji:


#include <cstdio>
#include <vector>
using namespace std;

/* Implementacja drzew przedzialowych wg strony:
* http://was.zaa.mimuw.edu.pl/?q=node/9
*/
#define SIZE 20
int w[1 << (SIZE+1)];

void insert(int x, int val) {
  int v = (1 << SIZE) + x;
  w[v] = val;
  while (v != 1){
    v /= 2;
    w[v] = w[2 * v] + w[2 * v + 1];
  }
}

int query(int a, int b){
  int va = (1 << SIZE) + a;
  int vb = (1 << SIZE) + b;

  int wyn = w[va];
  if (va != vb) 
    wyn += w[vb];

  while (va / 2 != vb / 2) {
    if (va % 2 == 0) wyn += w[va + 1]; 
    if (vb % 2 == 1) wyn += w[vb - 1]; 
    va /= 2; vb /= 2;
  }
  return wyn;
}

#define MAXN 1000005
long long wynik;
int n, pos, temp;
vector<int> tab[255];
char s[MAXN];

int main(){
 temp = scanf("%d", &n);
 temp = scanf("%s", s);
 for (int i = n - 1; i >= 0; --i)
   tab[int(s[i])].push_back(i);
 temp = scanf("%s", s);

 for (int i = 0; i < n; ++i){
   pos = tab[int(s[i])].back();
   tab[int(s[i])].pop_back();
   insert(pos, 1);
   pos += query(pos+1, MAXN);
   wynik += pos - i;
 }

 temp = printf("%lld\n", wynik);

 return 0;
}

Tym czego nie rozumiem jest zapis znajdujący się w operacjach na vektorze. M.in:

 


tab[int(s[i])].push_back(i);
//oraz
pos = tab[int(s[i])].back();
//oraz
tab[int(s[i])].pop_back();

Nie mogę rozgryźć jak można takowy zapis przełożyć na Javę, nie chodzi mi o push_back, back czy pop_back, to rozwiązałem, lecz nie wiem jak przełożyć znajdujący się przed nimi zapis:

tab[int(s[i])]

Próbowałem Vector Javovy, ArrayList... lecz utknąłem.

 

Z góry dziękuję za pomoc :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie wnikałem za bardzo w kod. Z tego co zrozumiałem to próbujesz się odwołać do konkretnego indexu w jakiejś kolekcji i go zmienić.

Tutaj możesz znaleźć inforamcje, że tego się w javie nie da zrobić. A przynajmniej nie w ładny sposób. Ew. możesz - tak jak napisali w tym wątku - samodzielnie zrobić swoją kolekcję która będzie umożliwiała takie operacje.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

tab jest tablicą wektorów. tab[jakaś_liczba] to odwołanie się do wektora na jakaś_liczba pozycji tablicy tab.

int(x) to rzutowanie iksa na liczbę całkowitą (nie jestem oswojony z taką formą rzutowania, imo jest tutaj zbędne, bo char w c/c++ to też liczba całkowita i spokojnie powinna się automatycznie skonwertować).

 

tab[int(s)]:

-s - wyciągnięcie znaku na i-tej pozycji tablicy s

-następnie znak jest rzutowany na int-a

-wyciągniecie wektora na obliczonej wyżej pozycji

 

Nie pamiętam jak java pozwala na potraktowanie znaku jako wartości liczbowej i czy da się to zrobić w tak bezpośredni sposób jak w C (ostatni raz to z 10 lat temu coś pisałem).

Chyba się da: https://stackoverflow.com/questions/16458564/convert-character-to-ascii-numeric-value-in-java

 

Jak zrobić podobną strukturę do tablicy wektorów, to już odpadam.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Sprawa rozwiązana. Dziękuję bardzo :D

Do rozwiązania potrzebny był poprawny zapis "tablicy wektorowej":

List<Integer> tab[] = new List[255];

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...