双指针(JAVA语言)

简介: 双指针(JAVA语言)

力扣283.移动零

 public static void moveZeroes(int[] nums) {
        int cur=0;
        int dest=-1;
        while(cur<nums.length&&dest<cur){
            if(nums[cur]!=0){
                dest++;
                int tmp=nums[cur];
                nums[cur]=nums[dest];
                nums[dest]=tmp;
 
            }
            cur++;
        }
   }

力扣1089复写零(难度较大,要重点理解,可以记不住咋写,但要记住想法)

数组中这种移动元素都是双指针

先根据异地操作,然后优化成双指针下的 就地操作

异地操作

就地操作:(这个问题从左向右是肯定不行的,因为会覆盖原来的数字)

cur指最后一个复写的值

dest在最后一个位置(此时使用下面这个方法,可以正好让两个都在他们自己的位置上)

面对特例(此处将n-1位置的值设置为0。)

class Solution {
    public static void duplicateZeros(int[] arr) {
        int dest=0;
        int cur=0;
        while(cur<arr.length){
            if(arr[cur]==0){
                dest++;
            }
            if(dest>=arr.length-1){
                break;
            }
            cur++;
            dest++;
        }
        if(dest==arr.length){
            arr[arr.length-1]=0;
            cur--;
            dest-=2;
        }
        while(dest>0){
            if(arr[cur]!=0){
                arr[dest]=arr[cur];
                dest--;
            }
            if(arr[cur]==0){
                arr[dest--]=0;
                if(dest==0){
                    break;
                }
                arr[dest--]=0;
            }
            cur--;
 
        }
    }
 
}

力扣202题快乐数

换句话说,我们需要找出循环的点。

class Solution {
    //返回n这个数每一位上的平方和
    public int bitSum(int n){
        int sum=0;
     while(n!=0){
         int t=n%10;
         sum+=t*t;
         n=n/10;
     }
     return sum;
    }
//谈谈写代码时候的困境,不知道怎么来写,才让指针走一步,没想到可以额外定义一个函数,然后将n这个值传给这个函数,就相当于指针动了一步
    public boolean isHappy(int n) {
        int fast=bitSum(n);
        int slow=n;
     while(slow!=fast){              //找相遇点,因为有环,所以一定会相遇
        slow=bitSum(slow);
        fast=bitSum(bitSum(fast));
      }
      return slow==1;
    }
}

力扣11题.盛最多水的容器(好写代码,方法不好想)

法1.暴力枚举,固定左边,计算所有的右边,然后枚举所有的数字,(两层循环,超时)

方法2:双指针

假如他的左边的数字小,那么就移动左边,右边的数字小就移动右边,是否移动,是通过比较双方数字的大小,来去做指针的移动的

class Solution {
    public int maxArea(int[] height) {
     int cur=0;
     int end=height.length-1;
     int ret=0;
     int i=0;
     while(cur<end){
        int v=Math.min(height[end],height[cur])*(end-cur);
        ret=Math.max(ret,v);
        if(height[cur]<height[end]){
            cur++;
        }else{
            end--;
        }
       
     }
     return ret;
    }
}


相关文章
|
5月前
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
472 94
|
7月前
|
JSON Java API
【干货满满】分享京东API接口到手价,用Java语言实现
本示例使用 Java 调用京东开放平台商品价格及优惠信息 API,通过商品详情和促销接口获取到手价(含优惠券、满减等),包含签名生成、HTTP 请求及响应解析逻辑,适用于比价工具、电商系统集成等场景。
|
5月前
|
Java
Java语言实现字母大小写转换的方法
Java提供了多种灵活的方法来处理字符串中的字母大小写转换。根据具体需求,可以选择适合的方法来实现。在大多数情况下,使用 String类或 Character类的方法已经足够。但是,在需要更复杂的逻辑或处理非常规字符集时,可以通过字符流或手动遍历字符串来实现更精细的控制。
398 18
|
5月前
|
存储 Java 索引
用Java语言实现一个自定义的ArrayList类
自定义MyArrayList类模拟Java ArrayList核心功能,支持泛型、动态扩容(1.5倍)、增删改查及越界检查,底层用Object数组实现,适合学习动态数组原理。
230 4
|
5月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
314 2
|
6月前
|
存储 Java Apache
Java语言操作INI配置文件策略
以上步骤展示了基本策略,在实际项目中可能需要根据具体需求进行调整优化。例如,在多线程环境中操作同一份配置时需要考虑线程安全问题;大型项目可能还需考虑性能问题等等。
280 15
|
7月前
|
存储 C++
C++语言中指针变量int和取值操作ptr详细说明。
总结起来,在 C++ 中正确理解和运用 int 类型地址及其相关取值、设定等操纵至关重要且基础性强:定义 int 类型 pointer 需加星号;初始化 pointer 需配合 & 取址;读写 pointer 执向之处需配合 * 解引用操纵进行。
631 12
|
7月前
|
算法 Java
Java语言实现链表反转的方法
这种反转方法不需要使用额外的存储空间,因此空间复杂度为,它只需要遍历一次链表,所以时间复杂度为,其中为链表的长度。这使得这种反转链表的方法既高效又实用。
584 0
|
7月前
|
JSON Java API
【干货满满】分享拼多多API接口到手价,用Java语言实现
本方案基于 Java 实现调用拼多多开放平台商品详情 API,通过联盟接口获取商品到手价(含拼团折扣与优惠券),包含签名生成、HTTP 请求及响应解析逻辑,适用于电商比价、导购系统集成。
|
7月前
|
JSON Java API
【干货满满】分享淘宝API接口到手价,用Java语言实现
本文介绍了如何使用 Java 调用淘宝开放平台 API 获取商品到手价,涵盖依赖配置、签名生成、HTTP 请求与响应解析等核心实现步骤。