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

question-closed C++ - SPOJ Flamaster

42 Warsaw Coding Academy
0 głosów
492 wizyt
pytanie zadane 10 listopada 2020 w C i C++ przez Karington Nowicjusz (120 p.)
zamknięte 10 listopada 2020 przez Karington

Cześć, proszę o pomoc w znalezieniu błędu w kodzie, który powoduje, że sędzia wyświetla komunikat o błędnej odpowiedzi, pomimo, że jak testuje, to odpowiedzi są prawidłowe. Siedzę tak już kolejną godzinę i nie wiem co naprawić :(

#include <iostream>
#include <string>
using namespace std;

void wypisanie (int *licznik, int litera)
{
  if (licznik [litera - 65] > 2)
  {
    cout << char (litera) << licznik [litera - 65];
  }
  else
  {

    for (int j = 0 ; j < licznik [litera - 65]; j++)
    {
    cout << char (litera);
    }

  }
}


int main()
        {
          string slowo;
          int litera, *licznik, c;

          licznik = new int [26];

          cin >> c;

          for (int p = 0; p < c; p++)
          {
            for (int h = 0 ; h < 26; h++) licznik [h] = 0;

            cin >> slowo;

          for (int i = 0 ; i < slowo.length(); i++)
          {
            if (slowo [i] == slowo [i - 1] || i == 0)
            {
              litera = int (slowo [i]);

              licznik [litera - 65] = licznik [litera - 65] + 1;

              if (i + 1 == slowo.length())
              {
                wypisanie (licznik, litera);
              }

            }
            else
            {
              wypisanie (licznik, litera);


              licznik [litera - 65] = 0;
              litera = int (slowo [i]);
              licznik [litera - 65] = 1;

            }


          }

          if (licznik [litera - 65] == 1) cout << (char) litera;
          cout << endl;


        }

        delete [] licznik;





        return 0;
        }

 

komentarz zamknięcia: Bardzo dziękuje za pomoc, program zwracał złą odpowiedź dla jednoliterowych słów
komentarz 10 listopada 2020 przez Whistleroosh Maniak (57,400 p.)

Po pierwsze w linii 40 na początku musisz sprawdzić czy i == 0, a dopiero potem czy slowo [i] == slowo [i - 1]. Sprawdź też co wypisuje program dla tego testu:

1
A

 

1 odpowiedź

0 głosów
odpowiedź 10 listopada 2020 przez TOM_CPP Pasjonat (22,640 p.)

Cały algorytm zamiany słowa umieściłbym w osobnej funkcji. Pozbyłbym się dynamicznie alokowanej tablicy i wskaźników, które zaciemniają kod czyniąc go mniej zrozumiałym. Zobacz przykład.

#include <iostream>

using namespace std;

string reduce( const string& name )
{
    if( name.size()<3 ) return name;

    string result;

    int counter {0};
    for( size_t i {0} ; i<name.size() ; ++i )
    {
        if( i != name.size()-1 && name[i] == name[i+1] ) ++counter;
        else
        {
            result += name[i];
            if( counter > 0 )
            {
               result += to_string(counter+1);
               counter = 0;
            }
        }
    }

    return result;
}

int main()
{
    cout << reduce("AAAUUU") << endl;
    cout << reduce("ABBCCCDDDDEEEEEFGGHIIJKKKL") << endl;
    cout << reduce("AAAAAAAAAABBBBBBBBBBBBBBBB") << endl;

    return 0;
}

 

Podobne pytania

0 głosów
0 odpowiedzi 282 wizyt
pytanie zadane 3 lutego 2021 w C i C++ przez Rainbow99 Początkujący (430 p.)
0 głosów
1 odpowiedź 648 wizyt
0 głosów
1 odpowiedź 1,055 wizyt
pytanie zadane 21 stycznia 2017 w C i C++ przez Krzysztof Rak Bywalec (2,420 p.)

93,383 zapytań

142,382 odpowiedzi

322,539 komentarzy

62,744 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

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...