1 / 15
Nov 2016

siemka, napisałem kod wykonujący zadanie, który wydaje mi się poprawny. Dla przykładowego wejścia z przykładu otrzymuję poprawne wyjście. Niestety nie mogę doszukać się błędu.

Oto kod:

 
#include <iostream>
using namespace std;
string int_to_string(int liczba)
{
    string zwracany;
    if(liczba<10)
        zwracany = char(liczba+48);
    else if(liczba>=10 && liczba<100)
    {
        string pomocniczy;
        zwracany = char(((liczba/10)%10)+48);
        pomocniczy = char((liczba%10)+48);
        zwracany += pomocniczy;
    }
    else
    {
        return "Jestesmy poza zakresem funkcji...";
    }
        return zwracany;
}
int main()
{
    int testAmount;
    cin>>testAmount;
    string slowa[testAmount];
    for(int i = 0 ; i<testAmount ; i++)
    {
        cin.clear();
        cin.sync();
        getline(cin,slowa[i]);
    }
//65-90
    for(int a = 0 ; a<testAmount ; a++)
    {
        for(int i = 65 ; i<91 ; i++)
        {
            size_t found = string::npos, found2 = string::npos;
            int licznik = 0;
            string pomoc;
            pomoc = char(i);
            found = slowa[a].find(pomoc);
            if(found!=string::npos)
            {
                found2 = found;
                licznik++;
                while(found!=string::npos)
                {
                    found = slowa[a].find(pomoc, found+1);
                    if(found!=string::npos) licznik++;
                }
            }
            if(licznik>2)
            {
                slowa[a].erase(found2+1,licznik-1);
                slowa[a].insert(found2+1,int_to_string(licznik));
            }
        }
        cout<<slowa[a]<<endl;
    }
    return 0;
}
  • created

    Oct '16
  • last reply

    Mar '17
  • 14

    replies

  • 1.2k

    views

  • 5

    users

  • 1

    like

  • 6

    links

W moim kompilatorze na to co wpisałeś wyskakuje odpowiedni output. Wpisując 1 CC dostaję CC.

Teraz jest gorzej niż było wcześniej. Poprawiłes że wyświetla ostatni test ale za to jest jakiś błąd w algorytmie:
https://ideone.com/iEzv4z4

PS.
Po co używasz własnej funkcji int_to_string(...) skoro istnieje już ta funkcja w bibliotece standardowej?

Dołącz na początku nagłówek:
string(oczywiście z nawiasami ostrymi ale coś tutaj na forum nie działa )

I zamiast swojej używaj funkcji to_string(...).

int_to_string działa poprawnie więc co za różnica, zmieniłem wcześniej na biblioteczną to_string(), ale nic to nie zmieniło. Natomiast co do przykładu, który dałeś to polecenie jest napisane niezrozumiale. Podany przykład sugeruje, ze jeżeli jakaś litera występuje w wyrazie to występuje ona tylko pod rząd. Właśnie pod takie przykłady napisałem kod.

Przeczytaj dokładnie teść zadania. Jeżeli nadal nie będziesz rozumiał to nic nie poradzę.

Nic nie wprowadza w błąd. Źle rozumujesz zadanie.
Test:
1
HDHDHHHH

Twój out:
H6HH

Poprawny out:
HDHDH4

Przykładowy test w poleceniu wprowadza w błąd. W podanych wyrazach na wejściu litery są uszeregowane alfabetycznie więc napisałem kod, który działa poprawnie tylko dla takich wariantów. Po poprawie pod warianty typu HDHDHHHH, czyli niealfabetyczne występowanie liter wszystko działa poprawnie, ale kod niestety jest zbyt długi, przekracza wymaganą wielkość.

https://ideone.com/fbfOfh20

Napiszę to bez użycia funkcji find, replace itd. odwołując się do kolejnych elementów stringa operatorem [], to chyba jedyne co tutaj ma sens.

Wytnij po prostu komentarze ze swojego kodu. Komunikat, jaki dostajesz, dotyczy wielkości pliku z kodem źródłowym, a nie wielkości kodu wynikowego - pliku wykonywalnego [exe] po kompilaji.

A to ciekawe, nie wiedziałem. Kod przeszedł po usunięciu komentarzy, ale i tak zrobiłem drugą wersje tak jak napisałem. Dzięki

Następnym razem czytaj uważniej bo w treści jest dokładnie napisane że:
Jeśli miała zamiar napisać więcej niż dwie takie same literki obok siebie w wyrazie, to teraz napisze literkę a następnie liczbę, określającą ilość wystąpień tej literki.

Nie patrz tylko na testy przykładowe , bo zazwyczaj są podane najprostsze.

4 months later

Panowie ja też utknąłem, kod wydaje się być ok, porobiłem trochę przypadków testowych - działa - SPOJ nie uznaje.

czy ktoś mi może podrzucić przypadek dla którego nie działa? Opcjonalnie nie wiem - SPOJOwi się nie podoba, że wyrzucam sekwencyjnie wyniki substing po substringu, zamiast budować nowego stringa? Jak ktoś jeszcze jest to proszę o pomoc.

Kod: http://ideone.com/16bBTf24

Edit: A niech to kule bijo randomowe śmieci poza tablicą bez wyjątku jak się wyjdzie :slight_smile: - rozwiązane.

  1. Nie ma większego sensu rzutować na liczbę.
  2. Zmień na pętlę for (wygodniejsza w tym zadaniu).
  3. Pętle zacznij od 2 elementu.
  4. Przechowaj sobie w oddzielnych zmiennych poprzedni znak i kolejny .
  5. Nie musisz sprawdzać czy znak należy do alfabetu (po prostu nie potrzebna operacja).