算法通关村十二关 | 字符串经典题目

news2024/12/29 10:30:23

字符串问题,大家记得模板思路即可,一个类型的题目有很多种。

1. 字符串反转的问题

1.1 反转字符串

题目:LeetCode344:

思路 

还是我们常见的双指针问题,

  • left字符数组头部指针,right字符数组尾部指针。
  • 当left < right,交换元素。
  • 当left >= right,反转结束,返回字符数组。

代码

    /**
     * 双指针反转字符串
     * @param s
     */
    public static void reverseString(char[] s){
        if (s == null || s.length == 0){
            return;
        }
        int n = s.length;
        for (int left = 0,right = n - 1; left < right; ++left ,--right){
            char tmp = s[left];
            s[left] = s[right];
            s[right] = tmp;
        }
    }

1.2 k个一组反转

题目:LeetCode541

思路 

        反转每个下表从2k的倍数开始,长度为k的子字符串,若该字符串长度不为k,则反转整个字符串,注意判断字符串长度不为k的时候。

代码

    public String reverseK(String s, int k){
        if (s == null || s.length() == 0){
            return s;
        }
        int n = s.length();
        char[] arr = s.toCharArray();
        for (int i = 0; i < n; i+= 2* k) {
            reverse(arr,i, Math.min(i+k,n)-1);
        }
        return new String(arr);
    }
    public void reverse(char[] arr ,int left, int right){
        while (left < right){
            char tmp = arr[left];
            arr[left] = arr[right];
            arr[right] = tmp;
            ++left;
            --right;
        }
    }

1.3 仅仅反转字母

题目:

思路一

分析题目后我们知道,只将字符串反转其他符号位置不变

方法一

第一次遍历将s中的多有字符存入栈中,然后第二次遍历所有字符串,遇到字符串就从栈顶元素弹出元素替换,遇到其他符号直接拼接。

代码一

    /**
     * 使用栈
     * @param s
     * @return
     */
    public String reverseOnlyLeeters(String s){
        Stack<Character> letters = new Stack<>();
        for (char c :s.toCharArray()) {
            //c是字符串,则压入
            if (Character.isLetter(c)){
                letters.push(c);
            }
        }
        StringBuilder ans = new StringBuilder();
        for (char c : s.toCharArray()) {
            //再次遍历,是字符弹栈,不是直接拼接
            if (Character.isLetter(c)) {
                ans.append(letters.pop());
            }else {
                ans.append(c);
            }
            }
        return ans.toString();
    }

思路二

方法二双指针

  1. 左指针首部元素,右指针尾部元素
  2. 左指针遇到元素交换,右指针遇到元素停止,遇到其他符号移动

代码二

    /**
     * 双指针
     */
    public String reverseOnlyletter2(String s){
        if (s == null || s.length() == 0){
            return s;
        }
        StringBuilder ans = new StringBuilder();
        int j = s.length() -1;
        for (int i = 0; i < s.length(); i++) {
            //第i位是字符,与j位置字符交换
            if (Character.isLetter(s.charAt(i))){
                //是字符停止,不是字符移动
                while (!Character.isLetter(s.charAt(j)))
                    j--;
                ans.append(j--);
            }else {
                //前面不是字符,不用反转
                ans.append(s.charAt(i));
            }
        }
        return ans.toString();
    }

1.4 反转字符串里的单词

题目:LeetCode151

思路一

 使用语言提供的方法来解决

  1. trim(),去掉头部和尾部空格
  2. split(),按空格分割成数组
  3. reverse(),将字符串数组反转,每个元素是一个单词
  4. join(),将字符串数组拼接成一个字符串

代码一

    public String reverseWord1(String s){
        if (s == null || s.length() == 0){
            return s;
        }
        //除去开头和末尾空格
        s = s.trim();
        //除去开头和末尾的空白字符作为分割符分割。"s+"匹配多个空白字符
        List<String> wordlist = Arrays.asList(s.split("\\s+"));
        Collections.reverse(wordlist);
        return String.join(" ",wordlist);
    }

思路二

自己实现上面的方法

1. tirmSpaces(),去掉多余的空白字符,包括开头和结尾

2. reverse(),将每个字符反转,

3. reverseWord(),根据空格反转每个单词

代码二

    /**
     * 手动实现上述功能
     */
    public String reverseWords(String s){

        StringBuilder sb = tirmSpaces(s);

        //反转全部字符串
        reverse(sb,0,s.length()-1);
        //反转每个单词
        reverseWord(sb);

        return sb.toString();
    }
    /**
     * 去除开头和末尾空格,以及多余的空格
     */
    public StringBuilder tirmSpaces(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 void reverse(StringBuilder sb, int left, int right){
        while (left < right){
            char tmp = sb.charAt(left);
            sb.setCharAt(left++,sb.charAt(right));
            sb.setCharAt(right,tmp);
        }
    }
    //反转单词
    public void reverseWord(StringBuilder sb){
        int n = sb.length();
        //start判断单词的首字母,end判断末尾字母
        int start = 0 ,end = 0;
        while (start < n){
            //循环值单词末尾
            while (end < n && sb.charAt(end) != ' '){
                ++end;
            }
            //反转单个单词
            reverse(sb,start,end-1);
            //更新start寻找下一个单词
            start = end + 1;
            ++end;
            //此时两个指针是重合状态
        }
    }

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

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

相关文章

【高危】致远A8前台上传解压漏洞 (MPS-6tdh-8qpu)

zhi.oscs1024.com​​​​​ 漏洞类型路径遍历发现时间2023-08-22漏洞等级高危MPS编号MPS-6tdh-8qpuCVE编号-漏洞影响广度广 漏洞危害 OSCS 描述 致远A8是一款企业级的办公自动化软件&#xff0c;提供全方位的企业管理解决方案。 致远A8协同管理系统在前台上传解压时存在漏洞&…

18.哈夫曼树及其应用

目录 一. 基本概念和术语 二. 哈夫曼树的构造 三. 哈夫曼编码 引例&#xff1a;将百分制成绩转换为五级制成绩&#xff1a;<60:E&#xff1b;60-69: D&#xff1b;70-79:C&#xff1b;80-89:B&#xff1b;90-100:A&#xff1b; 一个常用的算法是这样的&#xff1a; #in…

android外卖点餐界面(期末作业)

效果展示&#xff1a; AndroidMainFest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><a…

SpringBoot返回响应排除为 null 的字段

SpringBoot返回响应排除为 null 的字段 可以通过全局配置&#xff0c;使返回响应中为null的字段&#xff0c;不在出现在返回结果中。 注意&#xff1a;这样配置&#xff0c;使得返回响应包含的字段随请求结果变化&#xff0c;响应到底包含哪些字段不直观&#xff1b;除非业务…

[JavaWeb]【十】web后端开发-SpringBootWeb案例(配置文件)

目录 一、参数配置化 1.1 问题分析 1.2 问题解决&#xff08;application.properties&#xff09; 1.2.1 application.properties 1.2.2 AliOSSUtils 1.2.3 启动服务-测试 二、yml配置文件 2.1 配置格式 2.1.1 新增 application.yml 2.1.2 启动服务 2.2 XML与prope…

虚拟化技术小结

CPU时分复用原理 虚拟化本质 对底层硬件资源的复用&#xff0c;技术原理就是时分复用实现的。 原理 前提 1.CPU有很多核心&#xff0c;即core。CPU每个core同时且只能执行一个进程。 2.CPU&#xff08;core&#xff09;执行的时间可以被切分任意大小的时间片&#xff0c…

企业展示小程序的制作流程及关键步骤详解

在移动互联网时代&#xff0c;企业展示小程序已成为各个行业推广和展示的重要工具。搭建一个企业展示小程序不仅能够提高企业形象&#xff0c;还能够增加用户粘性和提升用户体验。下面我们来看一下如何从零基础搭建一个企业展示小程序&#xff0c;并顺利上线。 第一步&#xff…

【Java 高阶】一文精通 Spring MVC - 数据验证(七)

&#x1f449;博主介绍&#xff1a; 博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家&#xff0c;WEB架构师&#xff0c;阿里云专家博主&#xff0c;华为云云享专家&#xff0c;51CTO 专家博主 ⛪️ 个人社区&#x…

谈谈对 GMP 的简单认识

犹记得最开始学习 golang 的时候&#xff0c;大佬们分享 GMP 模型的时候&#xff0c;总感觉云里雾里&#xff0c;听了半天&#xff0c;并没有一个很清晰的概念&#xff0c;不知 xmd 是否会有这样的体会 虽然 golang 入门很简单&#xff0c;但是对于理解 golang 的设计思想和原…

【0823作业】C++:实现类嵌套,以及其构造函数、析构函数和拷贝构造函数

要求&#xff1a; 设计一个Per类。类中包含私有成员&#xff1a;姓名、年龄、指针成员身高、体重&#xff1b; 再设计一个Stu类&#xff0c;类中包含私有成员&#xff1a;成绩、Per类对象 p1&#xff1b; 设计这两个类的构造函数、析构函数和拷贝构造函数。 #include <iostr…

spring之Spring Boot入门与快速启动

Spring Boot入门与快速启动 摘要:引言:词汇解释:详细介绍:什么是Spring Boot以及其特点: 什么是Spring Boot以及其特点Spring Boot 简介:Spring Boot 的特点: 注意事项:使用Spring Boot初始化项目:使用 Spring Initializr:使用 Spring Boot CLI: 注意事项:代码示例:自动配置和约…

【数据库】详解数据库架构优化思路(两主架构、主从复制、冷热分离)

文章目录 1、为什么对数据库做优化2、双主架构双主架构的工作方式如下&#xff1a;双主架构的优势包括&#xff1a;但是一般不用这种架构&#xff0c;原因是&#xff1a; 3、主从复制主从复制的工作方式如下&#xff1a;主从复制的优势包括&#xff1a;主从复制的缺点 4、冷热分…

我是怎么从0到1搭建性能门禁系统的

背景 页面的性能对于用户的体验起着至关重要的作用&#xff0c;根据Mobify 研究发现&#xff0c;首页加载时间每减少100 毫秒&#xff0c;用户留存率就会增加1.11%。所以做好页面的性能优化&#xff0c;对于网站来说是一个非常重要的步骤。 在解决问题之前需要度量问题&#x…

吴师傅教你怎样开启联想电脑管家的极速模式

如果你的笔记本出现卡顿的情况&#xff0c;可以在联想电脑管家里开启极速模式试一下&#xff0c;会有运行速度上的提升&#xff0c;具体方法如下&#xff1a; 1、双击打开桌面上的联想电脑管家&#xff1b; 2、在打开的“联想电脑管家”界面里&#xff0c;点击右上边的“实用工…

mathematica 提取Solve(NSolve)函数变量

直接上例子&#xff0c;非常直观 求解的方程是&#xff1a; 0.7 sin ⁡ ( x ) 0.7 sin ⁡ ( 2 x ) 0.6047 0.7 \sin (x)0.7 \sin (2 x)0.6047 0.7sin(x)0.7sin(2x)0.6047 提取Solve(NSolve)函数变量&#xff0c;列表提取第一个元素 列表提取第3个元素 提取第三个元素的…

timer定时器,使用timer定时器完成LED123点亮

使用timer定时器完成LED123&#xff0c;一秒亮&#xff0c;一秒灭 #include "head.h" #include <linux/init.h> #include <linux/module.h> #include <linux/fs.h> #include <linux/uaccess.h> #include <linux/io.h> #include <l…

存在逻辑删除的表字段上建立唯一索引的巧办法 (逻辑删除与唯一索引)

存在逻辑删除的表字段上建立唯一索引的巧办法 首先&#xff0c;我们肯定是清楚地知道唯一键值逻辑删除位如果联合创建唯一索引的话&#xff0c;只能最多存在两条数据&#xff0c;无法满足不断删除新增的需求&#xff0c;所以需要一个巧妙的办法去实现有逻辑删除标志位的唯一索…

Anaconda安装pytorch-cuda

1 查看电脑对应cuda版本 【win-R】> 【cmd】> 确定 执行nvidia-smi&#xff0c;可以从图中看出&#xff0c;该电脑的CUDA Version为&#xff1a;11.6 2 官网查找对应的版本的安装语句 PyTorch官网&#xff1a;https://pytorch.org/ 2.1 可以直观的选择对应的版本 如…

LabVIEW开发聋哑人智能辅助手套

LabVIEW开发聋哑人智能辅助手套 今天的残疾人面临着许多挑战&#xff0c;最大的问题是沟通效率低下。由于这些人通常使用通信来请求基本必需品&#xff0c;因此在他们的日常生活中起着重要作用。能力不同的人通常会找到解决这个问题的方法。残疾人很难表达自己的需求&#xff…

MyBatis的场景应用(动态SQL、模糊查询及映射结果)附(Mybatis中#和$的区别)

一.Mybatis简介 MyBatis&#xff08;之前被称为iBatis&#xff09;是一种开源的持久化框架&#xff0c;它将面向关系数据库的持久层操作封装起来&#xff0c;使得开发人员可以通过简单的配置来实现对数据库的操作。MyBatis提供了灵活且强大的SQL映射功能&#xff0c;能够将数据…