双指针(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;
    }
}


相关文章
|
9天前
|
数据可视化 Java
Java语言使用DL4J实现图片分类
【6月更文挑战第14天】Java语言使用DL4J实现图片分类
19 3
|
8天前
|
算法 Java 程序员
面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性
【6月更文挑战第15天】面向对象编程(OOP)通过对象组合构建软件,C语言虽是过程式语言,但可通过结构体、函数指针模拟OOP特性。封装可使用结构体封装数据和方法,如模拟矩形对象。继承则通过结构体嵌套实现静态继承。多态可通过函数指针模拟,但C不支持虚函数表,实现复杂。C语言能体现OOP思想,但不如C++、Java等语言原生支持。
26 7
|
5天前
|
Java 数据安全/隐私保护 开发者
Java是一种完全支持面向对象编程的语言,其面向对象特性包括封装、继承、多态和抽象等
【6月更文挑战第18天】**面向对象编程(OOP)通过对象封装状态和行为,实现问题域的抽象。Java全面支持OOP,核心特性包括**: - **封装**:保护数据安全,隐藏内部细节。 - **继承**:子类继承父类属性和行为,促进代码重用。 - **多态**:一个接口多种实现,增强灵活性和扩展性。 - **抽象**:通过接口和抽象类抽离共性,简化复杂性。 **Java的OOP便于理解和解决复杂系统问题。**
18 3
|
11天前
|
安全 Java API
Java一分钟之-GraphQL:查询语言与API设计
【6月更文挑战第11天】GraphQL,一种革命性的查询语言,正在改变Web开发中的API构建和使用方式。它允许客户端按需请求数据,减少冗余,提升性能。本文概述了GraphQL的核心理念,如声明式查询、强类型和统一入口,并讨论了Java开发者常遇问题:过度查询、Schema设计和安全性。解决方案包括使用Dataloader、优化Schema和实现授权机制。通过理解原理、关注性能、重视安全和持续实践,开发者能更好地利用GraphQL构建高效API。
23 2
|
14天前
|
机器学习/深度学习 Java 开发者
Python vs. Java:语言之争的终结
【6月更文挑战第8天】Python与Java,两种影响力巨大的编程语言,各有千秋。Python以简洁语法和强大库支持在数据科学、机器学习领域大放异彩,适合快速原型设计;而Java以其稳定性能、跨平台兼容性在大型系统、企业应用中占据一席之地。语言之争实为互补,开发者应根据项目需求选择合适工具,两者和谐共存,共同推动编程技术进步。
|
15天前
|
存储 设计模式 Java
Java语言中反射动态代理接口的解释与演示
Java语言中反射动态代理接口的解释与演示
10 1
|
4天前
|
Java 大数据 API
|
8天前
|
IDE Oracle Java
[笔记] 疯狂JAVA讲义(第3版) 第1章 Java语言概述与开发环境
[笔记] 疯狂JAVA讲义(第3版) 第1章 Java语言概述与开发环境
|
11天前
|
JSON Go 数据格式
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(4)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】
|
11天前
|
Java 编译器 Go
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】(3)
Go 语言基础之指针、复合类型【数组、切片、指针、map、struct】

热门文章

最新文章