znajdowanie najczęściej powtarzających się liter

Odpowiedz Nowy wątek
2011-08-19 12:18
Puchacz
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 :)

Hash Mapa? :| - 0x200x20 2011-08-19 21:58

Pozostało 580 znaków

2011-08-19 23:56
0

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


"Robienie w Javie moge porównac do spuszczania wody w kiblu za pomoca wiadra z wodą przyniesioną ze studni zza 7 gór, którą się dodatkowo samemu wykopało łyżeczką do słodzenia herbaty."

Pozostało 580 znaków

2011-08-20 10:09
qwe
0

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

Pozostało 580 znaków

2011-08-20 10:22
qwe
0

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

Pozostało 580 znaków

2011-08-22 00:05
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


Znowu sortowanie bąbelkowe... - Zjarek 2011-08-22 08:21
Wiem, że dużo lepiej było by to zrobić quicksortem, ale jestem leniem i wole wpisać krótszy kod zwłaszcza, że kolega może sobie zmienić, żeby zoptymalizować algorytm bo z tym raczej nie będzie problemu. - ujemny 2011-08-22 12:12
Jakbyś był leniem, to nie pisałbyś w C++. - Krolik 2011-08-24 16:55
Trochę, źle to zrozumiałeś... Autorowi tematu chodziło tylko o algorytm a nie sortowanie, więc napisałem te które było najkrótsze. Bo mi się nie chciało a raczej nie było takiej potrzeby. - ujemny 2011-08-24 17:24

Pozostało 580 znaków

2011-08-24 17:02
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).

edytowany 2x, ostatnio: Krolik, 2011-08-24 17:04
No właśnie po to, że on pisze to w c++, więc nie wiem co ma na celu wklejenie kodu który się do niczego nie przyda autorowi tematu. - ujemny 2011-08-24 18:23
A to dział C++ czy algorytmy? Może wcale nie musi tego robić w C++. - Krolik 2011-08-24 19:15
Nawet jeżeli by nie musiał to i tak bezmyślne przepisanie kodu ze scali jest bez sensu bo zapewne nawet nie zna tego języka i nic mu z tego nie przyjdzie. - ujemny 2011-08-24 19:23
Jeśli tak, to dzięki temu postowi pozna ten język. A czy z tego skorzysta, to już jego wybór. - somekind 2011-08-25 00:34

Pozostało 580 znaków

2011-08-24 20:29
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ę?

edytowany 4x, ostatnio: 0x200x20, 2011-08-30 13:19
Usuń znaki nowej linii, będziesz miał w jednej. - Zjarek 2011-08-24 21:21
Wspomniana modyfikacja: println(readLine("Podaj ciąg znaków:").groupBy(identity).map(t => t._2.size + " <= " + t._1).mkString("\n")) - Wibowit 2011-08-24 22:41
A nawet ładniej: for ((x, y) <- readLine("Podaj ciąg znaków: ") groupBy identity) println(y.size + " <- " + x) - iooi 2011-08-31 15:05
Wolę bardziej funkcyjny wygląd, bez for comprehensions czy innego cukru :] Mała poprawka do poprzedniego: readLine("Podaj ciąg znaków: ").groupBy(identity).map(t => t._2.size + " <- " + t._1).foreach(println) - Wibowit 2011-08-31 17:44

Pozostało 580 znaków

2011-08-24 22:33
msm
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
edytowany 2x, ostatnio: msm, 2011-08-24 22:40

Pozostało 580 znaków

2011-08-24 23:48
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);

edytowany 2x, ostatnio: 0x200x20, 2011-08-25 13:45
System.console().readLine(), ale niewiele to skróci. - Wibowit 2011-08-25 00:51
raczej wydłuży, bo trzeba linijkę z dodatkowym printem machnąć - 0x200x20 2011-08-25 09:23
Chodziło mi o Console.readLine(String fmt, Object... args) - Wibowit 2011-08-25 09:30
Dałoby się to w 2 linijki mahnąć przy pomocy Collections.frequency, ale nie pamiętam już czy istnieje funkcja, która skonwertuje char[] do ArrayList<Character> - 0x200x20 2011-08-25 09:34

Pozostało 580 znaków

2011-08-27 21:41
Puchacz
0

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

Pozostało 580 znaków

2011-08-29 09:51
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);
mhm całkiem miłe - 0x200x20 2011-08-30 13:02

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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