力扣刷题篇——双指针

简介: 力扣刷题篇——双指针

2000 题目描述🧤:


给你一个下标从 0 开始的字符串 word 和一个字符 ch 。找出 ch 第一次出现的下标 i ,反转 word 中从下标 0 开始、直到下标 i 结束(含下标 i )的那段字符。如果 word 中不存在字符 ch ,则无需进行任何操作。


例如,如果 word = "abcdefd" 且 ch = "d" ,那么你应该 反转 从下标 0 开始、直到下标 3 结束(含下标 3 )。结果字符串将会是 "dcbaefd" 。

返回 结果字符串 。


示例 1:

输入:word = "abcdefd", ch = "d"

输出:"dcbaefd"

解释:"d" 第一次出现在下标 3 。

反转从下标 0 到下标 3(含下标 3)的这段字符,结果字符串是 "dcbaefd" 。


示例 2:

输入:word = "xyxzxe", ch = "z"

输出:"zxyxxe"

解释:"z" 第一次也是唯一一次出现是在下标 3 。

反转从下标 0 到下标 3(含下标 3)的这段字符,结果字符串是 "zxyxxe" 。


示例 3:

输入:word = "abcd", ch = "z"

输出:"abcd"

解释:"z" 不存在于 word 中。

无需执行反转操作,结果字符串是 "abcd" 。


解题思路🧤:

先查找以ch为指定下标

将字符串转化成数组

定义两个指针

从下标0开始直到 查找到ch才结束反转这段字符串

否则就直接返回字符串

代码附上🧤:

class Solution {
    public String reversePrefix(String word, char ch) {
        int index=word.indexOf(ch); //以ch为指定的下标开始search
        if(ch>=0){
            //当下标大于等于0的时候就开始reverse
            char []arr=word.toCharArray(); //将字符串转化吃字符数组
            //双指针
            int left=0; int right=index;
            while(left<right){ //当left<right的时候 每次交换两两 并且交换完 left++,right --
                char tmp=arr[left];
                arr[left]=arr[right];
                arr[right]=tmp;
                left++;
                right--;
            }
            word=new String(arr);
        }
        return word;
        }
}


917 题目描述🧤:


给你一个字符串 s ,根据下述规则反转字符串:


所有非英文字母保留在原有位置。


所有英文字母(小写或大写)位置反转。

返回反转后的 s 。


示例 1:

输入:s = "ab-cd"

输出:"dc-ba"


示例 2:

输入:s = "a-bC-dEf-ghIj"

输出:"j-Ih-gfE-dCba"


示例 3:

输入:s = "Test1ng-Leet=code-Q!"

输出:"Qedo1ct-eeLg=ntse-T!"


解题思路:


首先我们先根据题意定义一个判断是否为26个大小写英文字母的方法

然后定义两个指针 i 和 j

i从最左边开始扫描字符串 j从最右边开始扫描字符串 如果i和j 都扫描到了字符串 就交换i和j

的位置 然后继续扫描 否则反转过程中结束 返回最后的字符串 注意格式输出

代码附上🧤:

class Solution {
    private boolean check(char c){
        return c>='a'&&c<='z'||c>='A'&&c<='Z';
    }
    public String reverseOnlyLetters(String s) {
        int n=s.length();
        char ch[]=s.toCharArray(); //将字符串转化成字符数组
        int i=0;
        int j=n-1;
        while(i<j){
            if(!check(ch[i])){
                i++;
                continue;
            }
            if(!check(ch[j])){
                j--;
                continue;
            }
            char tmp=ch[i];
            ch[i]=ch[j];
            ch[j]=tmp;
            i++;
            j--;
        }
        return  String.valueOf(ch) ; //注意输出格式是字符串
    }
}

475 题目描述🧤:


冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。


在加热器的加热半径范围内的每个房屋都可以获得供暖。


现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置,请你找出并返回可以覆盖所有房屋的最小加热半径。


说明:所有供暖器都遵循你的半径标准,加热的半径也一样。


示例 1:

输入: houses = [1,2,3], heaters = [2]

输出: 1

解释: 仅在位置2上有一个供暖器。如果我们将加热半径设为1,那么所有房屋就都能得到供暖。


示例 2:

输入: houses = [1,2,3,4], heaters = [1,4]

输出: 1

解释: 在位置1, 4上有两个供暖器。我们需要将加热半径设为1,这样所有房屋就都能得到供暖。


示例 3:

输入:houses = [1,5], heaters = [2]

输出:3


解题思路🧤:

根据题目的意思就是找出每个房子落在哪个加热器之间,然后比较离他们较近的一个

思路就是用双指针 从左边开始一起移动

代码附上🧤:

class Solution {
    public int findRadius(int[] houses, int[] heaters) {
            // 其实就是要找每个房子落在哪个加热器之间,然后比较他们俩之中更近的那一侧。可以使用二分,也可以使用双指针,从头开始一起移动。
       int res=0; //加热半经
       for(int i=0;i<houses.length;i++){
            int min=Integer.MAX_VALUE;
            for(int j=0;j<heaters.length;j++){
                min=Math.min(min,Math.abs(houses[i]-heaters[j]));
            }
            res=Math.max(res,min); //取所以房子中最大的半经
       }
        return res;
        }
    }

面试16.06 题目描述🧤:


给定两个整数数组a和b,计算具有最小差绝对值的一对数值(每个数组中取一个值),并返回该对数值的差


示例:

输入:{1, 3, 15, 11, 2}, {23, 127, 235, 19, 8}

输出:3,即数值对(11, 8)


解题思路🧤:

这道题跟上面一道非常的相似 需要注意的就是数据的溢出 所以需要转化成long类型

特判差值为0的时候


代码附上🧤:

class Solution {
    public int smallestDifference(int[] a, int[] b) {
        //首先将两组数组排序
        Arrays.sort(a);
        Arrays.sort(b);
        int i=0,j=0;
        long min=Long.MAX_VALUE;
        while(i<a.length&&j<b.length){
            if(a[i]==b[j]) return 0;
            else if(a[i]>b[j]){
                min=Math.min(min,(long)a[i]-(long)b[j]);
                j++;
            }else{
                 min=Math.min(min,(long)b[j]-(long)a[i]);
                 i++;
            }
        }
        return (int)min;
    }
}

以上就是小王带给大家几道经典的双指针类型的题目 希望友友们统统 A掉




相关文章
|
3月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
59 6
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
52 4
|
4月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
121 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
35 1
|
3月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
4月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
66 7
|
4月前
|
Python
【Leetcode刷题Python】剑指 Offer 30. 包含min函数的栈
本文提供了实现一个包含min函数的栈的Python代码,确保min、push和pop操作的时间复杂度为O(1)。
29 4
|
4月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
55 3