【剑指offer刷题记录 java版】数组双指针 之 其它题目

这篇具有很好参考价值的文章主要介绍了【剑指offer刷题记录 java版】数组双指针 之 其它题目。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本系列文章记录labuladong的算法小抄中剑指offer题目



剑指 Offer II 018. 有效的回⽂

题目链接:https://leetcode.cn/problems/XltzEq/
【剑指offer刷题记录 java版】数组双指针 之 其它题目

class Solution {
    public boolean isPalindrome(String s) {
        // 先把所有字符转化成小写,并过滤掉空格和标点这类字符
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            char c = s.charAt(i);
            if (Character.isLetterOrDigit(c)) {
                sb.append(Character.toLowerCase(c));
            }
        }

        // 然后对剩下的这些目标字符执行双指针算法,判断回文串
        s = sb.toString();
        int left = 0;
        int right = s.length()-1;
        while(right>left){
            if(s.charAt(left)!=s.charAt(right)){
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

剑指 Offer 58 - I. 翻转单词顺序

题目链接:https://leetcode.cn/problems/fan-zhuan-dan-ci-shun-xu-lcof/
【剑指offer刷题记录 java版】数组双指针 之 其它题目
【剑指offer刷题记录 java版】数组双指针 之 其它题目

//先反转整个字符串,再逐个单词反转
class Solution {
    public String reverseWords(String s) {
        StringBuilder sb = trimSpaces(s);

        //整个字符串反转
        sb = sb.reverse();

        //逐个单词反转
        return reverseWord(sb);
    }

    //去除多余空格
    public StringBuilder trimSpaces(String s) {
        int left = 0, right = s.length() - 1;
        // 去掉字符串开头的空白字符
        while (left <= right && s.charAt(left) == ' ') {
            left++;
        }

        // 去掉字符串末尾的空白字符
        while (left <= right && s.charAt(right) == ' ') {
            right--;
        }

        // 将字符串间多余的空白字符去除
        StringBuilder sb = new StringBuilder();
        while(left<=right){
            char c=s.charAt(left);
            if(c!=' '){
                sb.append(c);
            }else if (sb.charAt(sb.length() - 1) != ' ') {
                sb.append(c);
            }
            left++;
        }
        return sb;
    }

    //逐单词反转
    public String reverseWord(StringBuilder sb){
        int left=0,right=0;
        while(right<sb.length()){
            while(right<sb.length() && sb.charAt(right)!=' '){right++;}
            //反转[left,right)的字符
            reverse(sb,left,right);
            right++;
            left=right;
        }
        return sb.toString();
    }

    //原地反转
    public void reverse(StringBuilder sb, int left, int right){
        while(right>left){
            char temp=sb.charAt(--right);
            sb.setCharAt(right,sb.charAt(left));
            sb.setCharAt(left,temp);
            left++;
        }
    }
}

剑指 Offer 21. 调整数组顺序使奇数位于偶数前⾯

题目链接:https://leetcode.cn/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/
【剑指offer刷题记录 java版】数组双指针 之 其它题目

//维护 nums前半部分 都是奇数
class Solution {
    public int[] exchange(int[] nums) {
        int left=0,right=0;
        while(right<nums.length){
            if(nums[right]%2==1){
                int temp=nums[right];
                nums[right]=nums[left];
                nums[left]=temp;
                left++;
            }
            right++;
        }
        return nums;
    }
}

//将后半部分奇数换到前半部分
class Solution {
    public int[] exchange(int[] nums) {
        int left=0,right=nums.length-1;
        while(left<right){
            while(left<right && nums[left]%2==1){
                left++;
            }
            int temp = nums[left];
            while(left<right && nums[right]%2==0){
                right--;
            }
            nums[left]=nums[right];
            nums[right]=temp;
        }
        return nums;
    }
}

剑指 Offer 57. 和为s的两个数字

题目链接:https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/
【剑指offer刷题记录 java版】数组双指针 之 其它题目

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int left=0,right=nums.length-1;
        int[] res = new int[2];
        while(left<=right){
            if(nums[left]+nums[right]>target){
                right--;
            }else if(nums[left]+nums[right]<target){
                left++;
            }else{
                res[0]=nums[left];
                res[1]=nums[right];
                return res;
            }
        }
        return res;
    }
}

剑指 Offer II 007. 数组中和为 0 的三个数

题目链接:https://leetcode.cn/problems/1fGaJU/
【剑指offer刷题记录 java版】数组双指针 之 其它题目
【剑指offer刷题记录 java版】数组双指针 之 其它题目

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> res = new ArrayList<>();
        for(int i=0;i<nums.length-2;i++){
            if (i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            int j=i+1;
            int k=nums.length-1;
            while(j<k){
                if(nums[i]+nums[j]+nums[k]<0){
                    j++;
                }else if(nums[i]+nums[j]+nums[k]>0){
                    k--;
                }else{
                    List<Integer> temp = new ArrayList<>();
                    temp.add(nums[i]);
                    temp.add(nums[j]);
                    temp.add(nums[k]);
                    res.add(temp);
                    while(j<k && nums[j]==nums[j+1]){j++;}
                    while(j<k && nums[j]==nums[k-1]){k--;}
                    j++;
                    k--;
                }
            }
        }
        return res;
    }
}

总结

使用的内置函数:文章来源地址https://www.toymoban.com/news/detail-500240.html

//判断字符是否是字母和数字
Character.isLetterOrDigit(c)
//字符转化成小写
Character.toLowerCase(c)
//反转字符串
stringbuilder.reverse()

到了这里,关于【剑指offer刷题记录 java版】数组双指针 之 其它题目的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【leetcode刷题】剑指offer基础版(完结)

    剑指 Offer 05. 替换空格 剑指 Offer 58 - II. 左旋转字符串 剑指 Offer 67. 把字符串转换成整数❤️ 剑指 Offer 06. 从尾到头打印链表 剑指 Offer 24. 反转链表 剑指 Offer 35. 复杂链表的复制 剑指 Offer 18. 删除链表的节点 剑指 Offer 22. 链表中倒数第k个节点 剑指 Offer 25. 合并两个排序的链表

    2024年02月09日
    浏览(47)
  • 剑指offer刷题笔记--Num21-30

    目录 1--调整数组顺序使奇数位于偶数前面(21) 2--链表中倒数第 k 个节点(22) 3--反转链表(24) 4--合并两个排序的链表(25) 5--树的子结构(26) 6--二叉树的镜像(27) 7--对称的二叉树(28) 8--顺时针打印矩阵(29) 9--包含min函数的栈(30) 主要思路:         双指针

    2024年02月12日
    浏览(42)
  • python_ACM模式《剑指offer刷题》链表1

    询问面试官是否可以改变链表结构 1. 翻转链表,再遍历链表打印。 2. 想要实现先遍历后输出,即先进后出,因此可借助栈结构。 3. 可用隐式的栈结构,递归来实现。 1. 2. 3. 采用递归的思想 注意是递归到最后一个元素才开始打印 即要先写递归 后写打印代码

    2024年01月23日
    浏览(51)
  • 【leetcode刷题之路】剑指Offer(3)——搜索与回溯算法

    7 搜索与回溯算法 7.1 【BFS】剑指 Offer 32 - I - 从上到下打印二叉树 https://leetcode.cn/problems/cong-shang-dao-xia-da-yin-er-cha-shu-lcof/   这里借助队列来实现广度优先遍历,由于需要访问每一层的节点,而且这一层访问才可以访问下一层,所以可以考虑队列的先进先出,先把每一层的节

    2024年02月13日
    浏览(58)
  • 【leetcode刷题之路】剑指Offer(4)——分治+排序算法+动态规划

    8 分治算法 8.1 【递归】剑指 Offer 07 - 重建二叉树 https://leetcode.cn/problems/zhong-jian-er-cha-shu-lcof/   前序遍历是根左右,中序遍历是左根右,这也就意味着前序遍历的第一个节点是整棵树的根节点,顺着这个节点找到它在中序遍历中的位置,即为in_root,那么in_root左边的都在左子

    2024年02月11日
    浏览(58)
  • 【剑指offer】数据结构——数组

    【剑指offer】03.数组中重复的数字 //03. 数组中重复的数字 // 找出数组中重复的数字。 // 力扣 // 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。 // 数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每 // 个数字重复了几次。请找出数组中任意一

    2024年02月08日
    浏览(40)
  • 剑指 Offer 66. 构建乘积数组

    给定一个数组 A[0,1,…,n-1] ,请构建一个数组 B[0,1,…,n-1] ,其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1] 。不能使用除法。 示例: 提示: 所有元素乘积之和不会溢出 32 位整数 a.length = 100000 解答

    2024年02月16日
    浏览(58)
  • 【剑指 offer】旋转数组的最小数字

    ✨个人主页:bit me👇 ✨当前专栏:算法训练营👇 核心考点:数组理解,二分查找,临界条件 描述: 有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这

    2023年04月20日
    浏览(52)
  • 剑指 Offer —— 数组和字符串

    在一个 n * m 的二维数组中: 每一行都按照从左到右 非递减 的顺序排序 每一列都按照从上到下 非递减 的顺序排序 请完成一个高效的函数,输入这样的一个 二维数组和一个整数 ,判断 数组中是否含有该整数 。 示例: 现有矩阵 matrix 如下: 给定 target = 5 ,返回 true 。 给定

    2023年04月24日
    浏览(47)
  • 【剑指offer】数组中重复的数字

    👑专栏内容:力扣刷题 ⛪个人主页:子夜的星的主页 💕座右铭:前路未远,步履不停 剑指offer:数组中重复的数字 在一个长度为 n 的数组里的所有数字都在 0 0 0 到 n − 1 n-1 n − 1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复,也不知道每个数字重复了几

    2024年01月20日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包