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

Java SPOJ Spacje

Object Storage Arubacloud
+1 głos
368 wizyt
pytanie zadane 2 kwietnia 2023 w SPOJ przez skyynet Początkujący (410 p.)

Siema, mam problem z zadaniem Spacje ze Spoja w Javie. Mógłby ktoś rzucić okiem na mój kod i podpowiedzieć dlaczego pokazuję błędną odpowiedź?

Link do zadania:

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

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Spacje
{
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        List<String> SMS = new ArrayList<>();
        while(true)
        {
            String line = input.nextLine();
            SMS.add(line);
            if(line.contains("."))
                break;
        }
        String sentences = "";
        for(String sentence : SMS)
        {
            String[] words = sentence.split(" ");
            for(String word : words)
            {
                String first_letter = word.substring(0, 1);
                String big_letter = first_letter.toUpperCase();
                word = word.substring(1, word.length());
                word = big_letter + word;
                sentences += word;
            }
            sentences += "\n";
        }
        System.out.println(sentences);
        input.close();
    }
}

 

1
komentarz 2 kwietnia 2023 przez Wiciorny Ekspert (272,310 p.)
edycja 2 kwietnia 2023 przez Wiciorny

Możesz to zrobić w 2 krokach.
Dla każdego ciągu znaków, robisz split po pustej spacji, uwcześnię robiąc trim na całym stringu, następnie masz tablice stringów, dla każdego z nich robisz w metodzie stream.map()
 

static String capitaliseFirstLetter(String name){
      return name.substring(0, 1).toUpperCase() + name.substring(1);
}

i potem łączysz listę w jeden string concat.

Twój program nie przejdzie testów wydajności masz 2 pętle for  zagnieżdzone w sobie dodatkowo objęte while. 

Dodatkowo zamiast Scannera stosuj Bufor odczytu, bo scaner jest zbyt wolny i dla spoja czasami są problemy. 
Na końcu robisz split po przecinku jeszcze, bo kropka i tak będzie w stringu dla którego ma być. 

Dowolny tekst, twój program wiesza się dla jednej litery, oraz Litery i przecinka np.

A,
A

komentarz 2 kwietnia 2023 przez skyynet Początkujący (410 p.)

Spróbowałem użyć twojego sposoby, ale nadal pokazuję błędną odpowiedź :/

import java.util.Scanner;

class Spacje2
{
    static String capitaliseFirstLetter(String name)
    {
        return name.substring(0, 1).toUpperCase() + name.substring(1);
    }
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        String sentence = "";
        while(true)
        {
            String line = input.nextLine();
            line = line.trim();
            String[] SMS = line.split(" ");
            for(String word : SMS)
            {
                sentence += capitaliseFirstLetter(word);
            }
            sentence += "\n";
            if(line.contains("."))
                break;
        }
        System.out.println(sentence);
        input.close();
    }
}

 

2
komentarz 2 kwietnia 2023 przez Wiciorny Ekspert (272,310 p.)
Nie wiem kto pisze testy, ale nie wiem jak to jest dla pojedynczych liter, twoje zadanie nie przechodzi dla CIagów A oraz np A, dla zdań gdzie nie ma kropki na końcu, i ostatecznie uważam, że problem może być z wydajnością użycia Scanera, co jest czeste.
komentarz 2 kwietnia 2023 przez skyynet Początkujący (410 p.)
Masz jakis pomysł jak inaczej zakończyć pętle while skoro nie wykrywaniem kropki w Stringu?

Próbowałem while(input.hasNextLine()) czy jakos tak ale wyskakiwał błąd
2
komentarz 2 kwietnia 2023 przez Wiciorny Ekspert (272,310 p.)
A co jeśli wpisuje słowa po enterze? Nie mam takiej możliwości widzisz tu jest linia po lini, a u Ciebie to nie jest zachowane, niestety nie znam testów, program też działą za wolno

skorzystaj z https://docs.oracle.com/javase/8/docs/api/java/io/BufferedReader.html
komentarz 2 kwietnia 2023 przez skyynet Początkujący (410 p.)

jak mam użyć tego żeby poprawić mój kod? Zastąpi to jakoś pętle while czy po prostu mam zamienić Scannera na Buffera?

Napisałem podobny kod w Pythonie, ale tez odrzuca odpowiedź :/

SMS =''
while(True):
    line = input()
    sentence = line.split(' ')
    for word in sentence:
        SMS += word[0:1].upper() + word[1:]
    if '.' in line:
        break
    SMS += '\n'
print(SMS)

 

1
komentarz 2 kwietnia 2023 przez Wiciorny Ekspert (272,310 p.)
uwzglednic musisz ze wczytywanie zdan i odpowiedzi ma trwac bez konca, mozliwe sa zdania bez kropki na koncu i calkowicie bez przecinka.
kazde zdanie zaczynajace z malej litery, ma zostawic mala litere ... na poczatku, gdyz duze maja zmiane tylko przy spacji oraz uwzglednic dwie spacje po sobie ;]

1 odpowiedź

+2 głosów
odpowiedź 2 kwietnia 2023 przez Wiciorny Ekspert (272,310 p.)
wybrane 2 kwietnia 2023 przez skyynet
 
Najlepsza

Przeanalizuj to poniżej, kod przechodzi, bo go przetestowałem i uzupełniłem.
 

  Scanner sc = new Scanner(System.in);
        while (sc.hasNextLine()) 
        {
            String line = sc.nextLine();
            String[] tab = line.toString().split(" ");
            for (int i=0;i<tab.length;i++) 
            {
                String x = tab[i];
                if(!x.isEmpty())
                {
                    if(i == 0)
                        System.out.print(x);
                    else
                        System.out.print(x.substring(0, 1).toUpperCase() + x.substring(1));
                }
            }
            System.out.println();
        }

Jest szybszy, nie zawiera zbędnych for w for oczywiście pojawia się pytanie, testów i to co mówiłem, testy musza pokryć każdy przypadek. Program ma dzialac dla kazdego wpisanego ciagu 

Czyli : ZDANIE = > ODPOWIEDŹ następnie zdanie => odpowiedź

bez końca. A dodatkowo JEŚLI ZDANIE ZACZYNA SIĘ Z MAŁEJ LITERY, to ma ona pozostać małą literą, natomiast tylko duże mają być te gdzie usuwałeś spacje i to jest klucz 


Zdanie testowe
ZdanieTestowe
zdanieZkropka.
zdanieZkropka.

Napisałem program w Scali tez, gdyż akuratnie tym językiem się teraz zajmuje

 

 def main(args: Array[String]): Unit = {
    val sc = new Scanner(System.in)
    while (sc.hasNextLine) {
      val line = sc.nextLine
      val tab = line.toString.split(" ")
      for (i <- 0 until tab.length) {
        val x = tab(i)
        if (!x.isEmpty) if (i == 0) System.out.print(x)
        else System.out.print(x.substring(0, 1).toUpperCase + x.substring(1))
      }
      System.out.println()
    }
  }

 

komentarz 2 kwietnia 2023 przez skyynet Początkujący (410 p.)
Bardzo dziękuje za pomoc!
1
komentarz 2 kwietnia 2023 przez Wiciorny Ekspert (272,310 p.)
Luzik, sam do końca nie kumałem o co chodzi dokładnie, gdyż nie jest to napisane, że dla pierwszej małej litery np. nie ma jej powiększyć, zgubiłem ten kontekst.

Podobne pytania

0 głosów
2 odpowiedzi 508 wizyt
pytanie zadane 20 marca 2020 w SPOJ przez Sashimo Użytkownik (740 p.)
0 głosów
1 odpowiedź 801 wizyt
pytanie zadane 19 października 2018 w SPOJ przez Archiwista Początkujący (250 p.)
0 głosów
2 odpowiedzi 777 wizyt
pytanie zadane 4 września 2018 w SPOJ przez Piotr Błaszczak Bywalec (2,890 p.)

92,683 zapytań

141,585 odpowiedzi

320,073 komentarzy

62,043 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...