一:题目
博主本文将用指向来形象的表示下标位的移动。
二:思路
1:两个整形,一个start,一个end,在一开始都 = 0,即这里都指向第一个元素。
2:在查到val之前,查一个,end就赋给start一个,然后再双双+1,即指向下一个元素。
3:当end查到了val的时候,此时此刻,start和end都是指向val的,所以此时我们让start就不变了,让end去向后遍历,找到第一个不是val的值,从这个值开始,只要end指向的值不是val,就覆盖掉start指向的值。覆盖一次,双双向后移动一次,再次判断end然后去覆盖,直到end超出数组范围!
4:最后所有不是val的值都会被放在前面,然后返回start的值即可,他的值就是与val不同的元素的数量。
三:思路的讲解
1:假设数组是以下,val为2。
Q:我们用end去找的时候,为什么不是val,要将end赋给star,并且双双+1?
A1:双双+1是因为要确保end找到val的时候,此时此刻end和start都指向了该val
A2:end赋给start,是因为在后面有重要作用,要用end指向的非val元素去覆盖start指向的val元素,并且这一步在找到val之前,对数组没有任何的影响
2:遇到val的时候
此时,strat指向val,不再移动,然后让end向后一直遍历,找到第一个不是val的值。用这个值去覆盖start指向的val
即:
3:覆盖完成后,双双向后移动,只要end指向的值不是val就去覆盖掉start
4:最后end会超出范围,即指向2后面的元素,这时候跳出循环
即:
5:此时start的值就是所有非val的元素的个数
四:代码展示
总结:此题思路理解之后,书写极为简单!