嵌套for循环迭代混淆中的数组

时间:2018-02-23 17:13:15

标签: c# arrays for-loop

编程新手,我刚刚练习这个问题。返回数组中最长的字符序列。我的回答是

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循环时有什么不同吗?任何帮助,将不胜感激。谢谢

2 个答案:

答案 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);
}