运行(C#)算法评估

时间:2015-10-27 06:58:10

标签: algorithm

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

  

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

例如,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);
    }

这是我过去测试的主要目的。但它在性能基准测试中失败了。任何人都可以阐明我的代码如何优化?感谢。

2 个答案:

答案 0 :(得分:1)

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

  • 首先,occurenceCounter > counter中的if条件是多余的。
  • 此外,请勿使用str.IndexOf()。相反,只要其occurrenceCounter大于maxOccur,就尝试将索引存储在变量中。这应该很容易。 (提示:你知道当前的指数和数量)

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

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

为此,循环直到string.length - 2(而非string.length - 1,正如您所做的那样)并在分配if时删除val2条件。

答案 1 :(得分:1)

为什么要使用转换.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