【问题标题】:Most repeated character in a row连续重复最多的字符
【发布时间】:2014-04-04 10:57:20
【问题描述】:

我的任务是连续显示最常用的字母。例如,如果你输入 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。 非常感谢所有帮助。

【问题讨论】:

  • 一种效果不那么糟糕但易于理解的方法是遍历字符串,如果字符不存在,则将其添加到值为 1 的字典中,如果存在则增加字符的值为 1。然后通过字符串一次 - 你有每个字符的计数。还有许多其他方法 - 所以这只是一种容易做到的方法
  • 计数是微不足道的,但上面的代码对你来说几乎没用。您需要的第一件事是某种方式来存储角色和它被看到的次数。如果这是香草帕斯卡,你需要写或借一些东西来做到这一点。

标签: pascal


【解决方案1】:

如果只是关于英文字符,您可能只需分配一个数组来保持每个字符的计数。在这种情况下,代码可能如下所示。

我是用 Delphi 写的。我希望它也适用于你的 Pascal。

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 &gt; Longest 确保在多个字符序列具有相同长度的情况下返回第一个最长的序列。如果您想要最后一个序列,请更改为 Current &gt;= Longest

【讨论】:

  • 感谢 GolezTrol 提供信息。但是,例如,如果我只想计算连续重复的字母,则应该在代码中进行更改。例如,在 abbbbccddbb 行中,我想要答案 b 和数字 4,因为连续有 4 个“B”,而另外两个我们不计算在内。是类似的东西还是完全是另一个代码?你能解释一下第三个循环是如何工作的吗?
  • 我认为这实际上要容易得多。您可以循环遍历字符串。如果一个字符与之前的字符相同,您可以增加一个计数器。如果字符不同,您可以将活动计数器与最高计数器进行比较。如果活动计数器较高,则更新高计数器。然后重置活动计数器。那么,你只需要两个整数和一个循环。
  • 循环实际上有点奇怪,但那是因为我使用char 类型作为数组索引。 Char 有点像数字,但不完全一样,所以这就是需要类型转换的原因。
  • 我添加了一段代码来搜索最长的序列。
  • 我按照你说的做,但你如何比较价值观? pastebin.com/X6xmVdwT 这是我所知道的。我无法比较元素,因为我删除了它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 2017-05-30
相关资源
最近更新 更多