znajdowanie najczęściej powtarzających się liter

0

Witam, jak w temacie. Napisałem sobie coś takiego ale mój algorytm jest słaby. Dostarcza wiele problemów więc może ktoś podpowie jakieś inne rozwiązanie :)

   int len = data.size();
    int add;
    if(!data.empty())
    {
        for(int i=0; i<len; ++i)
        {
            add=0;
            for(int j=i; j<len; ++j)
            {
                if(data[i]==data[j])
                {
                    add+=1;
                }

            }
            countOfRepeaterSign.push_back(add); //tu wrzucam ile razy powtórzyła się litera
            signs.push_back(find(alpha,data[i])); //tu wrzucam pozycję litery z alfabetu. 
            //find() odpowiada za znalezienie litery w alfabecie i zwrócenie jej pozycji.
        }
    }

efektem końcowym powinna być tablica zawierająca pary [ile razy powtórzyła się litera] [jaka to litera(int)] bądź dwie tablice (wektory) zawierające to co wyżej :)

przykład bardziej graficzny:

tablica [ile razy powtórzyła się litera] [jaka to litera(int)]
[10][9]
[9][1]
[8][3]

dzięki wielkie za podpowiedzi :)

0

Tworzysz tablicę 256-elementową, w której zapisujesz ile razy wystąpił dany znak - w jednym forze masz wszystko zliczone. Potem tylko posortować.

0

wydaje mi się, że za każdym razem do foocountOfRepeaterSignfoo wpisujesz wartość foo1foo, gdyż na początku pętli for jest [add=0;]

0

sorry, mój błąd nie spojrzałem że tam jest druga pętla ; p

0
#include <iostream>
using namespace std;
int main(int argc, char **argv)
{
	int tab[2][95];	
	for(int i=0;i<95;i++)
	{
		tab[0][i]=0;
		tab[1][i]=32+i;		
	}	
	string s;
	cout<<"Podaj ciag znakow: ";
	getline(cin,s);	
	for(unsigned int i=0; i<s.length(); i++)
	{
		for(int j=0; j<95; j++)
		{
			if(s[i]==tab[1][j])
			{
				tab[0][j]=tab[0][j]+1;
			}
		}
	}	
	for(int i=0; i<95; i++)
	{
		int temp,temp2;
		for(int j=0; j<94; j++)
		{
			if(tab[0][j]<tab[0][j+1])
			{
				temp=tab[0][j];
				temp2=tab[1][j];
				tab[0][j]=tab[0][j+1];
				tab[1][j]=tab[1][j+1];
				tab[0][j+1]=temp;
				tab[1][j+1]=temp2;
			}
		}
	}	
	int i=0;
	while(tab[0][i]!=0)
	{
		cout<<tab[0][i]<<"  "<<tab[1][i]<<endl;
		i++;
	}	
	return 0;
}

dostosuj to sobie do siebie

1

Hmm, po co pisać 30 linii C++ jak można to zrobić jedną w Scali:

println(readLine("Podaj ciąg znaków:").groupBy(identity).mapValues(_.size).mkString("\n"))

Działanie:

Podaj ciąg znaków: Ala ma kota
t -> 1
A -> 1
a -> 3
m -> 1
  -> 2
l -> 1
k -> 1
o -> 1

Dodatkowy bonus: działa dla Unicode a nie tylko dla ASCII.

Czasami współczuję studentom pierwszego roku, których katują C++ (tak, wiem, wiem, to dla ich dobra).

0

A po co w 30 jak można w 4?

	printf("Podaj ciąg znaków: ");
	std::map<char, int> m; 
	for(char c = getchar(); c != '\n'; c = getchar()) m[c]++;
	for(auto i : m) printf("%c->%d\n", i.first, i.second);

Kto da mniej?
Królik - a weź zmień format, żeby zamiast x -> y było y <- x. Też machniesz w jedną linijkę?

0

Nie znam niestety jeszcze bardzo dobrze haskella, ale również napisałem jednolikijkowca (który w przeciwieństwie do tego ze Scali ma w pełni modyfikowalny format wyjścia).

interact$("Podaj ciąg znaków:"++).unlines.map(\x->head x:" -> "++show(length x)).group.sort
0

Java, największe rozczarowanie: całe 3 linijki mało czytelnego kodu:

       TreeMap<Character, Integer> m = new TreeMap<Character, Integer>();
       for(char e : JOptionPane.showInputDialog("Podaj ciąg znaków:").toCharArray()) m.put(e, m.containsKey(e) ? m.get(e)+1 : 1);
       for(Map.Entry<Character, Integer> e: m.entrySet()) System.out.println(e.getKey() + " -> " + e.getValue());

Ktoś ma pomysł jak to zmniejszyć? (jakby tak wczytywać z konsoli to by zajęło jeszcze więcej);

0

aleście się rozpisali :) Wielkie dzięki, z problemem oczywiście sobie poradziłem i teraz wsio działa jak należy :).

0
0x200x20 napisał(a)
        for(auto i = m.begin(); i != m.end(); ++i) printf("%c->%d\n", i->first, i->second);

jak już się bawimy w nowy standard, to ładniej będzie

for(auto i : m) printf("%c->%d\n", i.first, i.second);

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