编程新手,我刚刚练习这个问题。返回数组中最长的字符序列。我的回答是
public void rLong()
{
string sequence = "aabcccddeeee";
char mac='\'';
char[] sArray = new char[8];
sArray = sequence.ToCharArray();
int k;
int tmp=0;
int i;
for(i=0; i < sArray.Length-1; i++)
{
int count=0;
for(k=0; k < sArray.Length-1; k++)
{
if(sArray[i]==sArray[k])
count++;
if(count>=tmp)
{
tmp=count;
mac=sArray[i];
}
}
}
Console.WriteLine("highest letter is {0} and count is {1}", mac,tmp);
}
答案:最高字母为e,计数为3
这个答案给了我正确的字符(e),但是错误的计数(3)它应该是4.但是通过反复试验,我想如果我在内循环中的sArray.Length取出-1得到正确的数(4)。
有人可以解释原因吗?我想在循环遍历索引时总是把-1放在array.length上。使用嵌套for循环时有什么不同吗?任何帮助,将不胜感激。谢谢
答案 0 :(得分:2)
如果您希望for循环迭代所有元素,则需要使用i < sArray.Length
。
在你的字符串中,有12个字符,这意味着我们想要循环12次。
循环从0开始并在i < sArray.Length
不再满足时结束,即i = 12.这意味着我将从0到11,这是12次迭代。如果你做i < sArray.Length - 1
那么它将停在i = 11,这是11次迭代。
这与使用k的内部for循环完全相同的情况,你想再次迭代整个字符串,所以它需要使用k < sArray.Length
而不是-1。
答案 1 :(得分:1)
该代码存在一些问题
你没有迭代整个数组。应该是k < sArray.Length;
。在基于零的数组上,您需要从0到长度 - 1.如果您使用<=
,则可以使用Length - 1
。
您没有找到序列。你正在计算比赛的总数,甚至没有那么高效。
非常有限的测试用例。你应该有角色分裂的情况 例如aaabbbcccaaffff
幸运的是,最后一个序列是捕获该错误的最长序列。
这是一次性完成的。
static void rLong()
{
string sequence = "aabcccddaaaeeee";
char? lastChar = null;
int longestSequence = 0;
int currentSequence = 1;
char? longestChar = null;
foreach (char c in sequence)
{
if (lastChar != null)
{
if (c == lastChar)
{
currentSequence++;
if(currentSequence > longestSequence)
{
longestSequence = currentSequence;
longestChar = c;
}
}
else
{
currentSequence = 1;
}
}
lastChar = c;
}
Debug.WriteLine("highest letter is {0} and count is {1}", longestChar, longestSequence);
}