2014-04-04 38 views
0

我的任務是在一行中顯示最常用的字母。例如,如果你放在aabbbbccbbb中,最重複的字符是B,它被使用了4次。關於同樣的任務有一個非常類似的話題,但我並不理解代碼。 Most repeating character in a string連續排列最多的字符

 Program Task; 
var s:string; 
    i,k,g,count:integer; 
    c:char; 
begin 
    Readln(s); 
    g:=0; 

    while Length(s) > 0 do 
    begin 
    c := s[1]; 
    i:=1; 
    while i<= Length(s) do 
    begin 
    If (c=s[i]) then 
    delete(s,i,1) 
    else 
    Inc(i); 
    If (c=s[i]) then 
    Inc(g); 
    end; 
    end; 

    Writeln(g); 

    Readln; 
end. 

我面臨很多問題。首先是我不知道如何顯示哪個字符是最常用的,其次是我不知道如何比較哪個重複字符最常用。 例如,如果我寫aaaabbbc它會給我7的答案,因爲有4xa和3xb。 所有的幫助最受讚賞。

+0

一個並不那麼可怕的效果,但容易理解的方法將貫穿字符串,如果字符不存在,將它添加到值爲1的冠詞,如果它存在增加值爲1 for人物。然後一次通過字符串 - 你有每個字符的計數。 還有很多其他的方式 - 所以這只是一個容易做 –

+0

計數是微不足道的,上面的代碼幾乎是無用的,但你。你需要的第一件事就是存儲角色的次數和看到的次數。如果這是香草pascal,你需要寫或借用一些東西來做到這一點。 –

回答

0

如果只是英文字符,你可能只是分配一個數組來保持每個字符的計數。在這種情況下,代碼可能看起來像這樣。

我用Delphi寫了這個。我希望它在你的帕斯卡風味中也可以。

program Task; 

{$APPTYPE CONSOLE} // For Delphi 

var 
    s: string[50]; 
    i: Integer; 
    Counters: array[Char] of Integer; 
    Highest: Char; 
begin 
    // Initialize counters. 
    for i := 0 to 255 do 
    Counters[Char(i)] := 0; 

    s := 'aabbbbccbbb'; 

    // Count the characters. 
    for i := 1 to Length(s) do 
    Inc(Counters[s[i]]); 

    // Find out which one is highest. 
    Highest := #0; 
    for i := 0 to 255 do 
    if Counters[Char(i)] > Counters[Highest] then 
     Highest := Char(i); 

    // Output that character and its count. 
    WriteLn('The highest character is ', Highest, ' with ', Counters[Highest], ' occurrences.'); 
    ReadLn; 
end. 

在不太學術的設置,使用數組像這可能不是最有效的,因爲它包含了每一個可能的字符計數器,包括那些沒有在字符串中發生的。這意味着,如果你想在unicode表中爲每個可能的字符使用這個確切的代碼,你的數組將會是幾兆字節大(在現代計算機上仍然不是問題,但仍然)。

您可以通過使用一種字典或列表來跟蹤這些項目來改進此代碼,因此您只需添加找到的項目,但是如果您必須自己編寫這些項目,那麼它將使您的程序相當有點大。

編輯:

如在評論每個請求:計數的字符的最長後續範圍:

program Task; 

{$APPTYPE CONSOLE} // For Delphi 

var 
    s: String; 
    i: Integer; 
    Longest: Integer; 
    Current: Integer; 
    LongestChar: Char; 
begin 
    s := 'aabbbbccbbb'; 

    Longest := 0; 
    Current := 0; 
    // Count the characters. 
    for i := 1 to Length(s) do 
    begin 
    Inc(Current); 
    // If it's the last char or the next char is going to be different, restart the counting. 
    if (i = Length(s)) or (s[i] <> s[i+1]) then 
    begin 
     if Current > Longest then 
     begin 
     Longest := Current; 
     LongestChar := s[i]; 
     end; 
     Current := 0; 
    end; 
    end; 

    // Output that character and its count. 
    WriteLn('The highest character is ', LongestChar, ' with ', Longest, ' occurrences.'); 
    ReadLn; 
end. 

Current > Longest確保在殼體返回的第一最長序列的多個字符序列具有相同的長度。如果您想要最後一個序列,請更改爲Current >= Longest

+0

謝謝,GolezTrol的信息。但是,如果我想只計算連續重複的字母,代碼中應該改變什麼。例如,在行abbbbccddbb我想要答案b和數字4,因爲有一個4'B'在一排,其他兩個我們不計算。它是類似的還是整個另一個代碼?你能解釋一下如何做第三次循環工作。 – RebelInc

+0

我認爲這實際上更容易。你可以循環使用字符串。如果一個角色與之前的角色相同,則可以增加一個計數器。如果角色不同,您可以將活動計數器與最高計數器進行比較。如果活動計數器較高,請更新高計數器。然後重置活動計數器。那麼,所有你需要的是兩個整數和一個循環。 – GolezTrol

+0

這些循環實際上有點奇怪,但那是因爲我使用'char'類型作爲數組索引。 Char有點像一個數字,但不完全相同,所以這就是爲什麼需要類型轉換。 – GolezTrol