【问题标题】:Run (C#) algorithm assessment运行 (C#) 算法评估
【发布时间】:2015-10-27 06:58:09
【问题描述】:

我最近一直在做编程算法,只是为了练习:)。 我从一个网站得到这个问题。问题是:

编写一个函数来查找字符串中最长运行的从零开始的索引。运行是相同字符的连续序列。如果有多个相同长度的运行,则返回第一个的索引。

例如,IndexOfLongestRun("abbcccddddcccbba") 应该返回 6,因为最长的运行是 dddd,它首先出现在索引 6 上。

所以我想出了这个:

public static int IndexOfLongestRun(string str)
    {
        string retval = string.Empty;
        string firstOccurence = string.Empty;
        string maxOccurence = string.Empty;
        string val1 = string.Empty;
        string val2 = string.Empty;
        int counter = 1;
        int occurenceCounter = 1;
        int maxOccur = 0;

        for (int i = 0; i < str.Length; i++)
        {
            val1 = str[i].ToString();
            if (i < str.Length - 1)
            {
                val2 = str[i + 1].ToString();
            }
            else
            {
                val2 = str[i].ToString();
            }

            if (val1 == val2)
            {
                firstOccurence = val1;
                occurenceCounter = occurenceCounter + counter;

                if (occurenceCounter > counter && occurenceCounter > maxOccur)
                {
                    maxOccur = occurenceCounter;
                    maxOccurence = firstOccurence;
                }
                continue;
            }
            else
            {
                occurenceCounter = 1;
            }
        }
        return str.IndexOf(maxOccurence, 0);
    }

这是过去我测试的主要目的。但是它在性能基准上让我失望。任何人都可以阐明如何优化我的这段代码吗?谢谢。

【问题讨论】:

  • 有什么问题?您正在遍历字符串一次,这在任何情况下都是必需的。
  • 问题是测试用例似乎有我的代码更好的版本,更准确地说是优化。
  • 我不确定是否需要在找到长度为 N 的运行后检查每个下一个字符。因为如果字符 [i] 和 [i+N] 不同,那么很明显,这两个字符之间没有更长的运行。

标签: algorithm


【解决方案1】:

您可以通过以下几种方式对其进行优化:

  • 首先,if 中的occurenceCounter &gt; counter 条件是多余的。
  • 另外,不要使用str.IndexOf()。相反,尝试在变量occurrenceCounter 大于maxOccur 时将索引存储在变量中。那应该很容易。 (提示:你知道当前的索引和计数)

除此之外,我不知道代码是否可以优化。另外,我对 C# 不太熟悉,所以,我不知道你那里是否有 char 类型(肯定是)。如果您必须比较单个字符,我建议不要使用 strings 进行比较。 (像toChar 这样的东西应该比toString 快)。

另外,我认为您的代码不会通过所有测试用例。检查:kaaabbb。您的代码将返回 4(我认为)(正确的 o/p 为 1)。

为此,循环直到string.length - 2(不是string.length - 1,就像你正在做的那样)并在分配val2时删除if条件。

【讨论】:

    【解决方案2】:

    为什么要使用转换 .ToString?这需要时间。我怀疑 C# 有字符串元素的 char 类型。你最好使用索引,而不是运行字符串。伪代码:

    MaxLen = 0
    MaxIndex = 0
    StartIndex = 0
    StartChar = s[0]
    for i = 1 to s.Length - 1 do
        if s[i] != StartChar then 
             Len = i - StartIndex
             if MaxLen < Len then
                 MaxLen = Len
                 MaxIndex = StartIndex 
             StartIndex = i
             StartChar = s[i]
    Len = s.Length - StartIndex
         if MaxLen < Len then
               MaxLen = Len
               MaxIndex = StartIndex 
    

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 2016-05-20
      • 2014-11-17
      • 1970-01-01
      相关资源
      最近更新 更多