我最近一直在做编程算法,只是为了练习:)。 我从一个网站得到了这个问题。问题是:
编写一个函数,查找字符串中最长运行的从零开始的索引。运行是相同字符的连续序列。如果有多个具有相同长度的运行,则返回第一个的索引。
例如,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);
}
这是我过去测试的主要目的。但它在性能基准测试中失败了。任何人都可以阐明我的代码如何优化?感谢。
答案 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