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

news2024/11/19 17:20:18

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


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

  • 剑指 Offer II 018. 有效的回⽂
  • 剑指 Offer 58 - I. 翻转单词顺序
  • 剑指 Offer 21. 调整数组顺序使奇数位于偶数前⾯
  • 剑指 Offer 57. 和为s的两个数字
  • 剑指 Offer II 007. 数组中和为 0 的三个数
  • 总结


剑指 Offer II 018. 有效的回⽂

题目链接:https://leetcode.cn/problems/XltzEq/
在这里插入图片描述

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/
在这里插入图片描述
在这里插入图片描述

//先反转整个字符串,再逐个单词反转
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/
在这里插入图片描述

//维护 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/
在这里插入图片描述

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/
在这里插入图片描述
在这里插入图片描述

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;
    }
}

总结

使用的内置函数:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/681026.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【裸机开发】IRQ 中断服务函数(三)—— 中断处理逻辑实现

实现了 IRQ 中断服务函数的汇编部分以后&#xff0c;接下来我们要使用C代码实现IRQ中断服务函数的具体逻辑&#xff0c;主要包含初始化和中断处理两部分。 全局中断初始化&#xff08;全局中断使能、IRQ中断使能&#xff09;具体中断处理逻辑实现 我们这里的中断是由按键产生…

springboot+mybatisplus复习笔记

1.环境搭建 依赖配置 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifa…

【Twitter爬虫】Twitter网络爬虫

利用selenium爬取Twitter 从2月9日起&#xff0c;Twitter不再支持免费访问Twitter API&#xff0c;继续使用Twitter API支付较高的费用。下面将介绍一种绕过Twitter API爬取推文的方式 Selenium Webdriver框架 首先介绍一下Selenium Webdriver&#xff0c;这是一款web自动化…

软件工程实践总结

前言 这次我们学校花了很多心血在这次的课设上&#xff0c;真的是特别感动和感谢&#xff0c;当你遇到真心为你好对你好的老师的时候&#xff0c;真的是会觉得人间值得&#xff01; 之前在学软件工程的时候我就会觉得这些理论的东西有什么用啊&#xff0c;什么UML&#xff0c;…

冒泡排序、选择排序、插入排序

冒泡排序 思路&#xff1a; 每次循环比较相邻两个元素&#xff0c;如果左边元素>右边元素&#xff0c;则交换位置。结果&#xff1a;将最大值放到最右边&#xff1b;一次循环过后&#xff0c;左边无序区域减少一个数&#xff0c;右边有序取增加一个数&#xff1b;序列长度…

【C++】AVL树的插入实现

目录 AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转左单旋(parent->_bf 2 && cur->_bf 1)a,b,c当高度为0a,b,c当高度为1a,b,c当高度为2a,b,c当高度为...... 右单旋(parent->_bf -2 && cur->_bf -1)a,b,c当高度为0a,b,c当高度为1a,b,c当高…

【群智能算法】基于浣熊优化算法的工程应用问题优化【Matlab代码#43】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第5节&#xff1a;资源获取】1. 原始COA算法1.1 开发阶段1.2 探索阶段 2. 工程应用问题优化2.1 压力容器设计2.2 拉压弹簧设计 3. 部分代码展示4. 仿真结果展示5. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章…

Spring事件机制让你的代码更优雅

今天为大家分享一下Spring的事件机制的使用&#xff0c;它是spring中一个非常好用也很实用的机制。 1. spring事件机制的概念 Spring的事件机制是基于观察者模式实现的&#xff0c;它可以在我们的实际应用程序中实现代码之间的解耦&#xff0c;提高代码的可维护性和可扩展性。…

ShardingSphere-Proxy 分库分表

安装ShardingSphere-Proxy 中间件封装 定位为透明化的数据库代理端&#xff0c;提供封装了数据库二进制协议的服务端版本&#xff0c;用于完成对异构语言的支持。 目前提供 MySQL 和 PostgreSQL版本&#xff0c;它可以使用任何兼容 MySQL/PostgreSQL 协议的访问客户端&#x…

面试必问:四种经典限流算法

今天给大家分享一下限流方面的&#xff0c;大家都知道&#xff0c;在分布式系统中&#xff0c;高并发场景下&#xff0c;为了防止系统因突然的流量激增而导致的崩溃&#xff0c;同时保证服务的高可用性和稳定性&#xff0c;限流是最常用的手段。希望能够给大家带来帮助&#xf…

STM32常见面试题

一、STM32F1和F4的区别&#xff1f; 内核不同&#xff1a;F1是Cortex-M3内核&#xff0c;F4是Cortex-M4内核&#xff1b; 主频不同&#xff1a;F1主频72MHz&#xff0c;F4主频168MHz&#xff1b; 浮点运算&#xff1a;F1无浮点运算单位&#xff0c;F4有&#xff1b; 功能性能&…

【无标题】vue中表单绑定v-model

表单绑定v-model 表单控件在实际开发中是非常常见的。特别是对于用户信息的提交&#xff0c;需要大量的表单。 Vue中使用v-model指令来实现表单元素和数据的双向绑定。 案例的解析&#xff1a; 当我们在输入框输入内容时 因为input中的v-model绑定了message&#xff0c;所以会…

Vue-搭建Vuex开发环境

1 安装Vuex 安装之前需要了解一个版本问题&#xff0c;在vue2中&#xff0c;要用vuex的3版本&#xff0c;在vue3中&#xff0c;要用vuex的4版本&#xff0c;要严格遵循这个版本要求&#xff0c;不然就会出现各种意想不到的问题&#xff0c;例如下方安装报错&#xff0c;就算因…

ubuntu修改应用图表|任务栏收藏|快捷方式|收藏夹

需要知道应用程序对应的.desktop文件的位置&#xff0c;然后使用sudo gedit打开。修改对应位置的信息就可以了。 参考&#xff1a;Linux下Desktop文件入门 1.desktop文件位置 一般存放在/usr/share/applications这个位置里面。 以vscode为例&#xff0c;使用sudo gedit code…

POJ - 2287 Tian Ji -- The Horse Racing

题目来源 2287 -- Tian Ji -- The Horse Racing (poj.org) 题目描述 田忌赛马是中国历史上一个著名的故事。 这个故事发生在2300年前&#xff0c;田忌是齐国的一个大官&#xff0c;他喜欢和齐王以及其他公子赛马。 田忌和齐王都有三类马&#xff0c;分别是下等马&#xff0…

1750_使用gcc对嵌入式代码控制逻辑进行测试

全部学习汇总&#xff1a; GreyZhang/c_basic: little bits of c. (github.com) 相信很多人的C语言学习是从printf开始的&#xff0c;为了验证我们的程序代码运行结果&#xff0c;我们通常会选择使用printf打印出我们计算的结果看一下是否与预期一致。到了嵌入式软件开发&#…

web前端工程师个人简历编写(附详细代码)

web前端工程师 h5css3完成简历编写&#xff0c;效果如下&#xff1a; 底部附有详细代码编写 编写Web前端工程师个人简历时&#xff0c;需要注意以下几点&#xff1a; 简洁明了&#xff1a;简历应该简洁明了&#xff0c;内容要点突出&#xff0c;避免冗长和废话。用简洁的语言…

Boost的介绍、安装与环境配置

文章目录 一、Boost库简介二、Boost的安装与编译&#xff08;一&#xff09;下载解压&#xff08;二&#xff09;编译静态库 三、配置VS环境四、其它环境的配置&#xff08;vscode、DevC&#xff09;&#xff08;一&#xff09;在DEVC中配置使用boost库的环境&#xff08;二&am…

java: 程序包javax.servlet.http不存在

问题描述 当项目从2.7.x的springboot升级到3.0.x的时候&#xff0c;遇到一个问题“java: 程序包javax.servlet.http不存在” 。这可能是一些包的精简变化导致的。错误信息如下&#xff1a; 错误代码段 package com.softdev.system.generator.config;import com.softdev.system…