Spacje - zadanie SPOJ, błąd wykonania (NZEC).

0

Zadanie ze Spoj-a . Tutaj treść http://pl.spoj.com/problems/JSPACE/, a poniżej mój kod:

import java.util.Scanner;

class Spacje {

	public static void main(String[] args) throws IOException {
		StringBuilder builder = new StringBuilder();
		Scanner sc = new Scanner(System.in);
		String line = sc.nextLine();
		while (line.length() >= 1) {
			builder.append(line);
			builder.append("\n");
			line = sc.nextLine();
		}

		String[] tab = builder.toString().split(" ");
		for (String x : tab) {
			if(x.length()>=2)
			System.out.print(x.substring(0, 1).toUpperCase() + ""
					+ x.substring(1));
			if(x.length()==1){
				System.out.print(x.toUpperCase());
			}
		}
	}
}

I cały czas wyskakuje mi bład : błąd wykonania (NZEC)- mógłby któs rzucić okiem, dlaczego tak się dzieje.
Jak testuje swój programik u siebie to te testy, które sam wymyśliłem on przechodzi.A tak w ogóle to wie ktoś co może być przyczyną tego rodzajów błedów jak NZEC?

Z góry dzięki za odpowiedź!

1

Szukałeś na forum? Ostatnio ktoś robił to samo.
Komentarz ze spoja: "Jeśli pierwszy wyraz w linijce jest z małej litery, to tak też powinien być wypisany - inaczej nie przejdzie. "
U Ciebie właśnie jest to inaczej.

1

Ja bym nie sklejał wszystkiego do jednego Stringa, ale konwertował wiersz po wierszu. U Ciebie sklejany jest ostatni wyraz każdego wiersza z pierwszym wyrazem kolejnego wiersza.

0

Kod poprawiony , z uwzględnieniem tej sytuacji z pierwszym wyrazem w linijce

import java.util.Scanner;

class Spacje {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String line = sc.nextLine();
		StringBuilder builder = new StringBuilder();
		while (line.length() >= 1) {
			String tab[] = line.split(" ");
			for (int i = 0; i < tab.length; i++) {

				if (i != 0) {
					if (tab[i].length() == 1) {
						tab[i] = tab[i].toUpperCase();
					} else if (tab[i].length() > 1) {
						tab[i] = tab[i].substring(0, 1).toUpperCase()
								+ tab[i].substring(1);
					}
				}
				if (tab[i].length() > 0)
					builder.append(tab[i]);
			}// Koniec for
			builder.append("\n");
			line = sc.nextLine();
		}// Koniec while

		System.out.println(builder.toString());
	}
}

i nadal ten sam rodzaj błedu NZEC.

0

Wrzuć całość w blok try i w catch dodaj

return;
0

Jest lepiej bo teraz wyskoczył błąd- błędna odpowiedź. I teraz, nadal nie widzę co jest źle w moim kodzie z góry.
A po drugie co do try-catch. Rozumiem, że to przechwyciło jakiś wyjątek i przez to teraz nie ma już tego błedu NZEC, ale nie widzę w jakiej sytuacji w tym kodzie z góry mógłby jakiś wyjątek mieć miejsce?

0

swoja droga to troche komplikujesz, mysle ze optymalnie by bylo po prostu wczytywac znak po znaku i potem jesli poprzednim znakiem byla spacja robic uppercase jesli nie to po prostu wypisywac to co wczytales (i oczywiscie nie wypisywac spacji). calosc algorytmu powinna zajac nie wiecej niz 3-4 linijki

0

Moim zdaniem Twój kod zawsze rzuca wyjątek - w tym miejscu:

line = sc.nextLine();

gdy już wszystko przeczytasz. Zorganizuj pętlę tak:

while(sc.hasNextLine())
{
    String line = sc.nextLine();
    ...
}
0

Masz błędy w kodzie. Ten kod został zaakceptowany.

import java.util.Scanner;
 
class Spacje 
{ 
    public static void main(String[] args)
    {
        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();
        }

    }
}
0

Rozwiązanie ze split wygląda na najprostsze, ale już zrobiłem znak-po-znaku:

import java.util.*;
import java.lang.*;
import java.io.*;
 
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine())
        {
            String line = sc.nextLine();
            StringBuilder outLine = new StringBuilder();
 
            boolean spaceBefore = false;
 
            int len = line.length();
            for(int i = 0; i < len; ++i) {
              char c = line.charAt(i);  
              if (c == ' ') {
                spaceBefore = true;
              } else {
                if (spaceBefore) {  
                  c = Character.toUpperCase(c);     
                } 
                outLine.append(c);
                spaceBefore = false;  
              }     
            }
 
            System.out.println(outLine);     
        }
    }
}

http://ideone.com/Ie5coj

1 użytkowników online, w tym zalogowanych: 0, gości: 1