嵌套for循环遍历数组的长度困惑:为何去掉-1才得正确计数?
嘿,这个问题真的是编程新手绕不开的小坑!我当初刚学的时候也犯过类似的错,咱们结合你的场景一点点说清楚~
首先,先拆解你的问题:你要统计数组里最长的连续字符序列,比如假设你的数组是类似['e','e','e','e']这样的4个e,之前内层循环加了Length-1,导致只数到3个,去掉之后就数对了4个。这核心原因是你的内层循环需要遍历到数组的最后一个元素,而加了-1之后,你漏掉了最后一个索引的元素。
举个具体的例子:假设数组长度是4,索引是0、1、2、3(数组索引从0开始,这是关键!)。你的内层循环应该是从当前起始索引的下一个位置开始,一直检查到最后一个元素(索引3)。如果你的循环条件写的是j < sArray.Length -1,那j的最大值就是2(因为4-1=3,j<3的话j只能到2),这样就漏掉了索引3的那个e,计数自然少了1。而去掉-1后,条件变成j < sArray.Length,j就能取到0到3的所有索引,最后一个e也被统计进去,计数就对了。
那什么时候需要对数组长度减一呢?主要分两种常见场景:
场景1:需要访问当前元素的下一个元素时
比如你要遍历数组,比较每一对相邻元素(比如检查arr[i]和arr[i+1]是否相等)。这时候如果i取到数组最后一个索引(Length-1),i+1就会变成Length,超出数组的最大索引(Length-1),直接报错。所以这时候循环条件要写成i < sArray.Length -1,让i最多到Length-2,这样i+1就是Length-1,刚好是最后一个元素,不会越界。场景2:用
<=来遍历索引时
有些习惯用<=的同学,会写i <= sArray.Length -1,这其实和i < sArray.Length是等价的,都是遍历所有索引0到Length-1。这时候的-1是因为数组最大索引是Length-1,用<=的话必须减一才能覆盖所有元素。
而你的场景属于第三种:需要遍历从某个起始点到数组末尾的所有元素,这时候循环条件直接用j < sArray.Length就好,不需要减一,否则会漏掉最后一个元素。
总结一下,写循环的时候别盲目加-1,先想清楚:你需要遍历哪些索引?这些索引的范围是从几到几?比如先在纸上列出来要访问的索引值,再推导循环条件,这样就不容易错啦~
内容的提问来源于stack exchange,提问作者Jeremiah Mora




