Leetcode双指针题(java作答)

目录

26.删除排序数组中的重复项

283.移动零

925.长按键入

面试题04.二维数组中的查找

532.数组中的K-diff数对

977.有序数组的平方

88.合并两个有序数组

349.两个数组的交集

830.较大分组的位置


26.删除排序数组中的重复项

给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

 

示例 1:

给定数组 nums = [1,1,2], 

函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 

你不需要考虑数组中超出新长度后面的元素。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array

class Solution {
    public int removeDuplicates(int[] nums) {
        int j=0;
        for(int i=1;i<nums.length;i++){
            if(nums[j]!=nums[i]){
                nums[j+1]=nums[i];
                j++;
            }
        }
        return j+1;
    }
}

283.移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:

输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:

必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes

class Solution {
    public void moveZeroes(int[] nums) {
        int j=0;
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=0){
                nums[j]=nums[i];
                if(i!=j){
                    nums[i]=0;
                }
                j++;
            }
        }
    }
}

925.长按键入

你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。

你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。

 

示例 1:

输入:name = "alex", typed = "aaleex"
输出:true
解释:'alex' 中的 'a' 和 'e' 被长按。
示例 2:

输入:name = "saeed", typed = "ssaaedd"
输出:false
解释:'e' 一定需要被键入两次,但在 typed 的输出中不是这样。
示例 3:

输入:name = "leelee", typed = "lleeelee"
输出:true
示例 4:

输入:name = "laiden", typed = "laiden"
输出:true
解释:长按名字中的字符并不是必要的。
 

提示:

name.length <= 1000
typed.length <= 1000
name 和 typed 的字符都是小写字母。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/long-pressed-name

class Solution {
    public boolean isLongPressedName(String name, String typed) {
        if(name.charAt(0)!=typed.charAt(0)){
            return false;
        }
        int flagLen=0;
        int j=0;
        boolean flag=true;
        for(int i=0;i<typed.length();i++){
            if(j==name.length()){
                if(typed.charAt(i)!=name.charAt(j-1)){
                    flag=false;
                    break;
                }
            }else{
                if(typed.charAt(i)==name.charAt(j)){
                    j++;
                    flagLen++;
                }else{
                    if(typed.charAt(i)!=name.charAt(j-1)){
                        flag=false;
                        break;
                    }
                }
            }
        }
        return flagLen==name.length()&&flag;
    }
}

面试题04.二维数组中的查找

在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

 

示例:

现有矩阵 matrix 如下:

[
  [1,   4,  7, 11, 15],
  [2,   5,  8, 12, 19],
  [3,   6,  9, 16, 22],
  [10, 13, 14, 17, 24],
  [18, 21, 23, 26, 30]
]

给定 target = 5,返回 true

给定 target = 20,返回 false

 

限制:

0 <= n <= 1000

0 <= m <= 1000

class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if(matrix.length==0){
            return false;
        }
        int i=matrix.length-1;
        int j=0;
        while(true){
            if(i<0|j>=matrix[0].length){
                break;
            }
            if(matrix[i][j]==target){
                return true;
            }
            if(matrix[i][j]<target){
                j++;
            }else{
                i--;
            }
        }
        return false;
    }
}

532.数组中的K-diff数对

给定一个整数数组和一个整数 k, 你需要在数组里找到不同的 k-diff 数对。这里将 k-diff 数对定义为一个整数对 (i, j), 其中 i  j 都是数组中的数字,且两数之差的绝对值是 k.

示例 1:

输入: [3, 1, 4, 1, 5], k = 2
输出: 2
解释: 数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
尽管数组中有两个1,但我们只应返回不同的数对的数量。

示例 2:

输入:[1, 2, 3, 4, 5], k = 1
输出: 4
解释: 数组中有四个 1-diff 数对, (1, 2), (2, 3), (3, 4) 和 (4, 5)。

示例 3:

输入: [1, 3, 1, 5, 4], k = 0
输出: 1
解释: 数组中只有一个 0-diff 数对,(1, 1)。

注意:

  1. 数对 (i, j) 和数对 (j, i) 被算作同一数对。
  2. 数组的长度不超过10,000。
  3. 所有输入的整数的范围在 [-1e7, 1e7]。
class Solution {
    public int findPairs(int[] nums, int k) {
        int count=0;
        Arrays.sort(nums);
        int j=0;
        int i=0;
        
        for(j=0;j<nums.length;j++){
            if(j!=0&&nums[j]==nums[j-1]){
                continue;
            }
            for(i=j+1;i<nums.length;i++){
                if(i!=j+1&&nums[i]==nums[i-1]){
                    continue;
                }
                if(Math.abs(nums[j]-nums[i])==k){
                    count++;
                }
            }    
        }
        return count;
    }
}

977.有序数组的平方

给定一个按非递减顺序排序的整数数组 A,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。

示例 1:

输入:[-4,-1,0,3,10]
输出:[0,1,9,16,100]

示例 2:

输入:[-7,-3,2,3,11]
输出:[4,9,9,49,121]

提示:

  1. 1 <= A.length <= 10000
  2. -10000 <= A[i] <= 10000
  3. A 已按非递减顺序排序。
class Solution {
    public int[] sortedSquares(int[] A) {
        int[] B=new int[A.length];
        int i=0;
        int j=A.length-1;
        int z=A.length-1;
        while(true){
            if(i>j){
                break;
            }
            if(A[i]*A[i]>A[j]*A[j]){
                B[z--]=A[i]*A[i];
                i++;
            }else{
                B[z--]=A[j]*A[j];
                j--;
            }
            
        }
        return B;
    }
}

88.合并两个有序数组

给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 使 num1 成为一个有序数组。

说明:

  • 初始化 nums1 和 nums2 的元素数量分别为 m 和 
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]
class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int[] nums=new int[nums1.length];
        for(int i=0;i<m;i++){
            nums[i]=nums1[i];
        }
        int i=0;
        int j=0;
        int z=0;
        while(true){
            if(z==nums.length){
                break;
            }
            if(i<m&&j<n){
                if(nums[i]>nums2[j]){
                    nums1[z++]=nums2[j++];
                }else{
                    nums1[z++]=nums[i++];
                }
            }else if(i==m){
                nums1[z++]=nums2[j++];
            }else if(j==n){
                nums1[z++]=nums[i++];
            }

        }
    }
}

349.两个数组的交集

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]

示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]

说明:

  • 输出结果中的每个元素一定是唯一的。
  • 我们可以不考虑输出结果的顺序。
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int i=0;
        int j=0;
        int[] num=new int[nums1.length];
        int z=0;
        while(true){
            if(i==nums1.length||j==nums2.length){
                break;
            }
            if(i!=0&&nums1[i]==nums1[i-1]){
                i++;
                continue;
            }
            if(j!=0&&nums2[j]==nums2[j-1]){
                j++;
                continue;
            }
            if(nums1[i]==nums2[j]){
                num[z++]=nums1[i];
                i++;
                j++;
            }else if(nums1[i]>nums2[j]){
                j++;
            }else{
                i++;
            }
        }
        int[] ans=new int[z];
        for(int k=0;k<z;k++){
            ans[k]=num[k];
        }
        return ans;
    }
}

830.较大分组的位置

在一个由小写字母构成的字符串 S 中,包含由一些连续的相同字符所构成的分组。

例如,在字符串 S = "abbxxxxzyy" 中,就含有 "a", "bb", "xxxx", "z" 和 "yy" 这样的一些分组。

我们称所有包含大于或等于三个连续字符的分组为较大分组。找到每一个较大分组的起始和终止位置。

最终结果按照字典顺序输出。

示例 1:

输入: "abbxxxxzzy"
输出: [[3,6]]
解释: "xxxx" 是一个起始于 3 且终止于 6 的较大分组。
示例 2:

输入: "abc"
输出: []
解释: "a","b" 和 "c" 均不是符合要求的较大分组。
示例 3:

输入: "abcdddeeeeaabbbcd"
输出: [[3,5],[6,9],[12,14]]
说明:  1 <= S.length <= 1000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/positions-of-large-groups

class Solution {
    public List<List<Integer>> largeGroupPositions(String S) {
        List<List<Integer>> lis = new ArrayList();
        List<Integer> inlis = new ArrayList();
        int i=0;
        int j=0;
        int count = 0;
        while(true){
            if(S.charAt(i)==S.charAt(j)){
                count++;
                j++;
            }else{
                if(count>=3){
                    inlis.add(i);
                    inlis.add(i+count-1);
                    lis.add(inlis);
                    inlis = new ArrayList();
                }
                i=j;
                count=0;
            }
            if(j>=S.length()){
                if(count>=3){
                    inlis.add(i);
                    inlis.add(i+count-1);
                    lis.add(inlis);
                    inlis = new ArrayList();
                }
                i=j;
                count=0;
                break;
            }
        }
        return lis;
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: leetcode高频100java是指LeetCode网站上的100道经典算法目,使用Java语言进行解答。这些目涵盖了各种算法和数据结构,包括数组、链表、树、图、排序、查找、动态规划等等。这些目是程序员面试和算法学习的重要参考资料,也是提高编程能力和解决实际问的有效途径。 ### 回答2: LeetCode是一个著名的程序员面试库,其高频100是指在面试中经常被问到的100道目。这些目涵盖了算法、数据结构、数学等各个领域,是程序员求职和成长过程中不可或缺的练习材料。本文将介绍这100Java解法。 这100覆盖了许多经典算法,如动态规划、贪心算法、双指针等。对于Java程序员来说,最重要的是要掌握这些算法的核心思想及其实现方法。此外,Java核心类库中的一些常用类和函数,如String、Math、Arrays等也是解过程中常用的工具。 对于高频100,需要掌握的核心算法包括二分查找、数组和链表的操作、栈和队列、哈希表、递归等。此外,还需要掌握字符串操作、动态规划、贪心算法、回溯算法、深度/广度优先搜索等经典算法。 以数组和链表为例,需要掌握的操作包括数组的查找、排序和去重,以及链表的遍历、反转和合并等。使用Java语言来实现这些操作时,可以使用Java核心库中的Arrays和Collections类,它们提供了便捷的方法来处理数组和集合。 另外,Java语言还提供了众多数据结构,如栈、队列、双端队列、优先队列、堆等。这些数据结构可以进行复杂的算法操作,如优先队列可以实现贪心算法、堆可以实现堆排序等。Java还提供了Map和Set这两个关键字来实现哈希表的操作,使得开发人员可以轻松地实现哈希表。 最后,Java还提供了众多的工具类和常用函数,例如字符串操作函数、正则表达式、数学函数等。使用这些函数可以为算法提供更加便捷和高效的实现方法。 总之,掌握LeetCode高频100Java解法需要深入理解算法核心思想,灵活使用Java语言的各种工具和函数。在实际练习中,需要注重代码的可读性、复杂度和鲁棒性。 ### 回答3: LeetCode是全球最大的在线练习平台之一,通过解决LeetCode的问,可以帮助人们提高他们的编程能力。在LeetCode上,有许多高频,这些目被认为是最重要的,因为这些目经常在面试中出现。Java作为一种流行的编程语言,被大多数程序员所熟悉和使用。因此,LeetCode高频100java是程序员们需要掌握的重要知识点。接下来,我将详细介绍LeetCode高频100JavaLeetCode高频100java包括许多经典的算法和数据结构问,例如:动态规划、回溯、DFS、BFS、二分查找、排序、链表、栈、队列、树、图等。每个问都有一份完整的Java代码实现,以帮助程序员理解算法思路。不仅如此,Java代码还包括了详细的注释和解释,以帮助程序员更好地掌握算法。 LeetCode高频100java对于Java程序员来说很重要,因为这些目是在日常编码工作和面试中经常出现的问。通过解决这些问,程序员们能够提高他们的编码能力和思维能力。此外,这些问也能帮助程序员们更好地了解Java语言的使用和优化,加深对Java语言特性的理解。 总结来说,对于Java程序员来说,掌握LeetCode高频100java非常重要。这将帮助他们提高他们的编程水平,了解更多的算法和数据结构。通过解决这些问,他们将更容易通过面试,获得更好的编程工作。因此,Java程序员们应该花费足够的时间和精力去学习和掌握LeetCode高频100java

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值