实话实说,刷题当中数组应该是最简单的一类题目,但是目前初期自己码题的时候大体思路是ok的,但是逻辑实现的细节和语法规范问题还是存在问题,话不多说,来看题:
题号26、27
其中26题为移除有序数组的重复项,27题为移除输入数组的给定值的元素,两道题都非常经典。这类题有一种非常有效的方法——双指针法
1.双指针法:通过一个快指针和慢指针在一个for循环下完成两个for循环的工作。(在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法)
举例:拿26题来举例,我们可以设置两个指针p和q,p为慢指针,q为快指针。开始时设p=0,q=1;在后续的操作中保持q一直在p的后方,以这样的方式实现一个循环中使用两个指针来实现操作。又拿27题来举例,27题中有两个指针i和j,其中i是慢遍历指针从数组第一个元素开始,而j是从数组最后开始,用于给值为val的nums[i]传值。
代码如下:
class Solution {
public int removeDuplicates(int[] nums) {
int p=0;
int q=1;
while(q<nums.length){
if(nums[p]!=nums[q]){
nums[p+1]=nums[q];
p++;
}
q++;
}
return p+1;
}
}
注意事项:在使用双指针法时,一定要注意越界问题即保证指针是有意义的。
2.for循环的妙用
在使用for循环的时候我们经常强制自己去写满三个语句:即循环变量初始化,判断条件,循环变量自加。但是需要灵活使用循环变量的时候其实写好前两个语句就好。循环体中配合判断语句,可以更好更灵活的进行遍历。