【算法通关村】第三关数组白银挑战笔记

双指针

1双指针思想
2删除元素
2.1原地删除等于val的元素
  • 双指针,快慢

快指针遍历,慢指针等待。

当nums[fast]==val时,fast移动,slow等待到不同时。

当nums[fast]!=val时,fast和slow一块移动。

 public int removeElement(int[] nums, int val) {
         int slow=0;
         for(int fast=0;fast<nums.length;fast++){
             if(nums[fast]!=val){
                 nums[slow]=nums[fast];
                 slow++;
             }
         }
         return slow;
     }
  • 双指针,左右对撞

left找等于val的,right找不等于val的。用右边的替代左边。直到相遇。

 public int removeElement(int[] nums, int val) {
         int left=0;
         int right=nums.length-1;
         for(left=0;left<=right;){
             if(nums[left]==val&&nums[right]!=val){
                 int temp=nums[right];
                 nums[right]=nums[left];
                 nums[left]=temp;
             }
             if(nums[left]!=val) left++;
             if(nums[right]==val) right--;
         }
         return left;
     }
  • 双指针,对撞加覆盖

left遍历,等于val,就用right覆盖。不等于val就往后。直到相遇。

 public int removeElement(int[] nums, int val) {
         int right=nums.length-1;
         for(int left=0;left<=right;){
             if(nums[left]==val){
                 nums[left]=nums[right];
                 right--;
             } else {
                 left++;
             }
             
         }
         return right+1;
     }
2.2删除有序数组中的重复项
2.2.1保留一个重复值

快指针负责数组遍历,慢指针指向有效数组的最后一个位置。

slow=1

 public static int removeDuplicates(int[] nums) {
         //slow表示可以放入新元素的位置,索引为0的元素不用管
         int slow = 1;
         //循环起到了快指针的作用
         for (int fast = 1; fast < nums.length; fast++) { //fast=1;
             if (nums[fast] != nums[slow - 1]) {
                 nums[slow] = nums[fast];
                 slow++;
             }
         }
         return slow;
     }
2.2.2保留两个重复值

 public int removeDuplicates(int[] nums) {
         if(nums.length<=2) return nums.length;
         int slow=2;
         for(int fast=2;fast<nums.length;fast++){ //fast=2
             if(nums[fast]!=nums[slow-2]){
                 nums[slow]=nums[fast];
                 slow++;
             }
         }
         return slow;
     }
3元素奇偶移动
 public int[] sortArrayByParity(int[] nums) {
         int left=0,right=nums.length-1;
         while(left<right){
             if(nums[left]%2 > nums[right]%2){
                 int temp=nums[left];
                 nums[left]=nums[right];
                 nums[right]=temp;
             }
             if(nums[left]%2==0) left++;
             if(nums[right]%2==1) right--;
         }
         return nums;
 ​
     }
4数组轮转问题
 public void rotate(int[] nums, int k) {
         k%=nums.length;
         reverse(nums,0,nums.length-1);
         reverse(nums,0,k-1);
         reverse(nums,k,nums.length-1);   
     }
     public void reverse(int[] a,int start,int end){
         while(start<end){
             int temp=a[end];
             a[end]=a[start];
             a[start]=temp;
             start++;
             end--;
         }
     }
5数组的区间专题

%%%

 public List<String> summaryRanges(int[] nums) {
         List<String> res=new ArrayList<>();
         int slow=0;
         for(int fast=0;fast<nums.length;fast++){
             if(fast+1==nums.length||nums[fast]+1!=nums[fast+1]){  //fast+1???
                 StringBuilder sb=new StringBuilder();
                 sb.append(nums[slow]);
                 if(slow!=fast){
                     sb.append("->").append(nums[fast]);
                 }
                 res.add(sb.toString());
                 slow=fast+1;
             }
         }
         return res;
     }

lc163缺失的区间

6字符串替换空格问题

没有说清楚是针对于字符串还是针对于字符串数组,所以这里分类进行讨论

  • 字符串

 public String replaceSpace(String s) {
         String res="";
         for(int i=0;i<s.length();i++){
             char c=s.charAt(i);
             if(c==' '){
                 res+="%20";
             } else {
                 res+=c;
             }
         }
         return res;
     }
  • 字符串数组

 public String replaceSpace(String s) {
         int cnt=0;
         for
     }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值