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

Java SPOJ Spacje

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
+1 głos
207 wizyt
pytanie zadane 2 kwietnia 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 przez Wiciorny Ekspert (260,110 p.)
edycja 2 kwietnia 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 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 przez Wiciorny Ekspert (260,110 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 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 przez Wiciorny Ekspert (260,110 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 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 przez Wiciorny Ekspert (260,110 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 przez Wiciorny Ekspert (260,110 p.)
wybrane 2 kwietnia 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 przez skyynet Początkujący (410 p.)
Bardzo dziękuje za pomoc!
1
komentarz 2 kwietnia przez Wiciorny Ekspert (260,110 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 355 wizyt
pytanie zadane 20 marca 2020 w SPOJ przez Sashimo Użytkownik (740 p.)
0 głosów
1 odpowiedź 644 wizyt
pytanie zadane 19 października 2018 w SPOJ przez Archiwista Początkujący (250 p.)
0 głosów
2 odpowiedzi 673 wizyt
pytanie zadane 4 września 2018 w SPOJ przez Piotr Błaszczak Bywalec (2,890 p.)

91,848 zapytań

140,523 odpowiedzi

317,031 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.

...