• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

problem z zadaniem ROL ze spoja w jezyku Java

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
147 wizyt
pytanie zadane 12 marca w SPOJ przez skyynet Początkujący (410 p.)

Siema,

Mam problem z zadaniem ROL w Javie, moim zdaniem powinno być wszystko ok, ale sędzia ze SPOJa się ze mną nie zgadza. Mógłby mi ktoś pomóc w znalezieniu błedu?

link do zadania:

https://pl.spoj.com/problems/PTROL/

import java.util.Scanner;

public class ROL {
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        int t = input.nextInt();
        int size;
        int[] list;
        for(int i=0;i<t;i++)
        {
            size = input.nextInt();
            list = new int[size];
            for(int j=0;j<size;j++)
            {
                list[j] = input.nextInt();
            }
            for(int number : list)
            {
                if(number == list[0])
                    continue;
                else if(number == list[size-1])
                {
                    System.out.println(number + " " + list[0]);
                    break;
                }
                System.out.print(number+" ");
            }
        }
        input.close();
    }
}

 

2 odpowiedzi

+1 głos
odpowiedź 12 marca przez Great Stary wyjadacz (11,860 p.)

1

3 5 5 5

Zastanów się czemu pętla pomija więcej niż pierwszą iterację pętli:

if(number == list[0])
    continue;

Prostsze pominięcie wypisania pierwszego elementu:

for(int j = 1; j < size; j++)
{
    System.out.println(...)              
}
System.out.println() // [0]

Oczywiście możesz użyć pętli foreach, ale musisz zrobić to poprawnie (np. .stream().skip() / .subList()).

1
komentarz 12 marca przez Wiciorny Ekspert (260,090 p.)
co tu jest prostszego? :)  Niespełniony warunek nigdy się nie ewaluuje więc nie jest to problem, a forach jest wydajniejszy zdecydowanie jesli praca będzie wkonywana w równoległym środowisku.
1
komentarz 12 marca przez skyynet Początkujący (410 p.)

Bardzo dziękuje za pomoc faktycznie nie zwróciłem uwagi gdy pierwsza liczby z listy się powtarza

+1 głos
odpowiedź 12 marca przez Wiciorny Ekspert (260,090 p.)

Przemyśl to : 

 if(number == list[0])
                    continue;

jeśli któryś z elementów na liście będzie równy pierwszemu to się to pominie. 

Przykład  1,2,3,1,3 -> 4 element na liście będzie równy 1 == list[0] zostanie pominięty. 

Cykliczne przesunięcie możesz rozwiązać przemyślając 1 fakt, każdy element przesuwa się o indeks wcześniej więc tak naprawdę niewiele operacji jest Ci potrzebnych 

int[] arr = {1, 2, 3, 4, 5, 6, 7};
int n = arr.length;

// przesuń elementy cyklicznie o jedną pozycję w lewo
int temp = arr[0];
for (int i = 1; i < n; i++) {
    arr[i-1] = arr[i];
}
arr[n-1] = temp;

// wyświetl przesuniętą tablicę
for (int i = 0; i < n; i++) {
    System.out.print(arr[i] + " ");
}



 



 

1
komentarz 12 marca przez VBService Ekspert (242,470 p.)

Jako ciekawostka smiley

Bardzo lubię javascript, więc pomyślałem ...

const arr = [ 1, 2, 3, 4, 5, 6, 7 ];
arr.push(arr.shift());
// console.log(arr);


i czy da się w java ...  System.arraycopy [ 1 ] [ 2

int[] arr = {1, 2, 3, 4, 5, 6, 7};
int temp = arr[0];
System.arraycopy(arr, 1, arr, 0, arr.length - 1);
arr[arr.length - 1] = temp;


 

1
komentarz 12 marca przez Wiciorny Ekspert (260,090 p.)

Ilość operacji z o(n), rośnie w każdym twoim rozwiązaniu do n^2.. dlatego nie lubię "gotowych funkcji", jeśli ktoś  robi coś tak bo lubi dłubać to okej, ale z takim podejściem w projektach, potem nie ma co się dziwić, że u "mnie wolno działa". 
System array nie przejdzie na spokju 

Co ciekawe System.arraycopy jest używane przez  Arrays.copyOf
 

Benchmark                                          (SIZE)  Mode  Cnt        Score       Error  Units
ObjectsCopyBenchmark.arraysCopyOfBenchmark             10  avgt  100        8.535 ±     0.006  ns/op
ObjectsCopyBenchmark.arraysCopyOfBenchmark        1000000  avgt  100  2831316.981 ± 15956.082  ns/op
ObjectsCopyBenchmark.systemArrayCopyBenchmark          10  avgt  100        9.278 ±     0.005  ns/op
ObjectsCopyBenchmark.systemArrayCopyBenchmark     1000000  avgt  100  2826917.513 ± 15585.400  ns/op
PrimitivesCopyBenchmark.arraysCopyOfBenchmark          10  avgt  100        9.172 ±     0.008  ns/op
PrimitivesCopyBenchmark.arraysCopyOfBenchmark     1000000  avgt  100   476395.127 ±   310.189  ns/op
PrimitivesCopyBenchmark.systemArrayCopyBenchmark       10  avgt  100        8.952 ±     0.004  ns/op
PrimitivesCopyBenchmark.systemArrayCopyBenchmark  1000000  avgt  100   475088.291 ±   726.416  ns/op

ale dalej SPOJ bedzie miał z Systemem problem, tak mi się wydaje, chyba że zmienili podejście do spawdzania. 
Dodatkowo nie używałbym  metod korzystających z 

@HotSpotIntrinsicCandidate

JS niestety nie ma takich wad, tzn ma inne oczywiście jak każdy język, ale na JAVE bardzo trzeba uważać, szczególnie korzystająć z wbudowanych metod własnie, bo czasami w czeluściach mogą się dziać naprawdę przedzwine rzeczy 

Podobne pytania

0 głosów
0 odpowiedzi 120 wizyt
pytanie zadane 6 września 2020 w SPOJ przez magda_19 Gaduła (3,080 p.)
0 głosów
1 odpowiedź 192 wizyt
pytanie zadane 5 marca 2021 w SPOJ przez AbroX9 Nowicjusz (140 p.)
0 głosów
0 odpowiedzi 261 wizyt
pytanie zadane 24 lipca 2018 w SPOJ przez ksareks Nowicjusz (140 p.)

91,847 zapytań

140,523 odpowiedzi

317,030 komentarzy

61,170 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...