关于内层for循环计数器初始值与break语句的疑问(数组去重场景)
关于内层for循环计数器初始值与break语句的疑问(数组去重场景)
嗨,刚学编程的小伙伴别着急,我来慢慢给你捋清楚这两个问题😊
一、为什么内层循环的j要从i+1开始,而不是0?
你担心从i+1开始会跳过第一个元素的比较,其实完全不会哦!咱们举个具体的例子来理解:
假设咱们有个数组[1, 2, 1, 3],现在要找重复元素。
- 当
i=0(对应数组里的第一个元素1),j从0+1=1开始,会依次和索引1的2、索引2的1、索引3的3比较——这时候第一个元素已经和后面所有元素都比过了,根本没漏掉! - 如果
j从0开始的话,首先j=0的时候,和i=0是同一个元素,这时候会误判成“重复”,这显然不对。而且当i=1的时候,j又从0开始,会再比较一次索引1的2和索引0的1,可这个比较在i=0的时候已经做过了呀,纯纯是做无用功,浪费时间。
简单来说,当我们用双层循环找重复时,i指向的元素,前面的元素已经和它比较过了(当i是前一个元素的时候),所以咱们只需要检查i后面的元素有没有和它重复的就行,j=i+1正好能做到这一点:既不会重复比较,也不会漏掉任何该比的元素,效率还更高。
二、为什么要用break;?
break的作用是跳出当前的内层循环,咱们还是拿刚才的例子说:
当i=0,j=2的时候,发现元素1重复了,这时候咱们已经找到当前i对应的重复项了,后面的j=3(元素3)肯定和i=0的1不重复,再继续循环下去也没意义,直接用break跳出内层循环,去处理下一个i就行,能节省不少不必要的计算。
当然啦,如果你的需求是找出某个元素的所有重复项,那可能不需要break,但在常见的数组去重场景里,找到一个重复就处理(比如删除重复项),然后break是很合理的操作。
备注:内容来源于stack exchange,提问作者Fady Saad




