数组 - 双指针法(用于移除元素)
快指针:寻找新数组的元素
慢指针:指向更新新数组下标的位置
代码实现为:
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex = 0;
//注意题目要求不使用额外数组空间!而是原地移除!
for(int fastIndex = 0;fastIndex<nums.length;fastIndex++){
if(nums[fastIndex]!=val){
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}
代码实现为:
class Solution {
public int removeDuplicates(int[] nums) {
//题目条件:有序数组
//题目要求:原地删除
int slowIndex = 0;
for(int fastIndex=0;fastIndex<nums.length;fastIndex++){
while(nums[fastIndex]!=nums[slowIndex]){
nums[slowIndex+1] = nums[fastIndex];
slowIndex++;
}
}
//要返回的k为元素数量,而slowIndex代表索引,故最后返回的值应该+1
return slowIndex+1;
}
}
别忘了最后补零操作
class Solution {
public void moveZeroes(int[] nums) {
//原地操作
int slowIndex = 0;
for(int fastIndex = 0;fastIndex<nums.length;fastIndex++){
if(nums[fastIndex]!=0){
nums[slowIndex] = nums[fastIndex];
slowIndex++;
}
}
//把0补齐
for(int i = slowIndex;i<nums.length;i++){
nums[i] = 0;
}
}
}
代码实现为:
class Solution {
public boolean backspaceCompare(String s, String t) {
int skipS = 0 , skipT = 0;
//利用字符串中的length()方法可知字符串的长度
//长度别忘了减1,否则会造成越界
int i = s.length()-1, j = t.length()-1;
while(i>=0 || j>=0){
while(i>=0){
if(s.charAt(i)=='#'){
skipS++;
i--;
}else if(skipS>0){
//退格,即跳过要删除的元素
i--;
skipS--;
}else{
break;
}
}
while(j>=0){
if(t.charAt(j)=='#'){
skipT++;
j--;
} else if(skipT>0){
j--;
skipT--;
}else{
break;
}
}
if(i>=0 && j>=0){
if(s.charAt(i)!=t.charAt(j)){
return false;
}
}else{
if(i>=0 || j>=0){
return false;
}
}
i--;
j--;
}
return true;
}
}
代码实现为:
class Solution {
public int[] sortedSquares(int[] nums) {
//注意题目条件:非递减数组,可以粗略理解为递增数组,则平方最大的数一定在数组首部或尾部
int left = 0 , right = nums.length-1;
int[] ans = new int[nums.length];
int i = nums.length-1;
while(left<=right){
if(nums[left]*nums[left]>=nums[right]*nums[right]){
ans[i] = nums[left]*nums[left];
left++;
}else{
ans[i] = nums[right]*nums[right];
right--;
}
i--;
}
return ans;
}
}