day16【代码随想录】反转字符串、反转字符串中的元音字母、反转字符串||、反转字符串中的单词|||、替换空格、翻转字符串中的单词、左旋转字符串

news2024/11/20 18:22:19

文章目录

  • 一、反转字符串(力扣344)
  • 二、反转字符串中的元音字母(力扣345)
  • 三、反转字符串 II(力扣541)
  • 四、反转字符串中的单词 III(力扣557)
  • 五、替换空格(剑指 Offer 05)
  • 六、翻转字符串里的单词(力扣151)
  • 七、左旋转字符串(剑指Offer58-II)


一、反转字符串(力扣344)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
在这里插入图片描述
较为简单

class Solution {
    public void reverseString(char[] s) {
        int l = 0;
        int r = s.length-1;
        while(l<r){
            char temp = s[l];
            s[l]=s[r];
            s[r]=temp;
            l++;
            r--;
        }

    }
}

在这里插入图片描述

二、反转字符串中的元音字母(力扣345)

给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。

元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现。
在这里插入图片描述
参考一次快排思路:

class Solution {
    public String reverseVowels(String s) {
        char[] ss = s.toCharArray();
        String title = "aeiouAEIOU";
        int l=0;
        int r=ss.length-1;
        while(l<r){
            while(l<r && title.indexOf(ss[l])< 0){
                l++;
            }
            while(l<r && title.indexOf(ss[r])< 0){
                r--;
            }
            char temp = ss[l];
            ss[l] = ss[r];
            ss[r] = temp;
            l++;
            r--;
        }
    return String.valueOf(ss);
    }
}

在这里插入图片描述

三、反转字符串 II(力扣541)

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
    在这里插入图片描述
class Solution {
    public String reverseStr(String s, int k) {
        char[] ss = s.toCharArray();
        for(int i=0;i<ss.length;i+=2*k){
            //反转i-i+k的字符
            int left = i;
            int right = i+k-1;
            if(right<=ss.length-1){ //不要超过数组的长度
                while(left<right){
                    char temp = ss[left];
                    ss[left] = ss[right];
                    ss[right] = temp;
                    left++;
                    right--;
                }
                continue;
            }
            left = i;
            right = ss.length-1;
            while(left<right){
                char temp = ss[left];
                ss[left] = ss[right];
                ss[right] = temp;
                left++;
                right--;
            }
        }
        return String.valueOf(ss);
    }
}

在这里插入图片描述

四、反转字符串中的单词 III(力扣557)

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序
在这里插入图片描述

class Solution {
    public String reverseWords(String s) {
        char[] ss = s.toCharArray();
        int i = 0;
        int j = 0;
        for(;j<ss.length; j++){//跳到下一个单词的起始位置
            if(ss[j]==' '){
                //反转单词
                int left = i;
                int right=j-1;
                while(left<right){
                    char temp = ss[left];
                    ss[left] = ss[right];
                    ss[right] = temp;
                    left++;
                    right--;
                }
                i=j+1;
                j=i;
            }
        }
        int left = i;
        int right = ss.length-1;
        while(left<right){
            char temp = ss[left];
            ss[left] = ss[right];
            ss[right] = temp;
            left++;
            right--;
        }
        return String.valueOf(ss);
    }
}

在这里插入图片描述

五、替换空格(剑指 Offer 05)

请实现一个函数,把字符串 s 中的每个空格替换成"%20"

在这里插入图片描述
双指针法:
按照正常思路 从前往后遍历,碰到空格时,所有元素需要向后挪动两个单位,时间复杂度较大。
很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
这么做有两个好处:

  • 不用申请新数组。
  • 从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
class Solution {
    public String replaceSpace(String s) {
        StringBuilder str = new StringBuilder();
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==' '){
                str.append("  ");//扩充字符串的大小
            }
        }
        //如果没有空格直接返回
        if(str.length()==0){
            return s;
        }
        //定义两个指针
        int left = s.length()-1; //指向最后一个位置
        s +=str.toString();
        int right = s.length()-1;//指向扩展字符串的最后一个位置
        char[] chars= s.toCharArray();
        while(left>=0){
            if(chars[left]==' '){
                chars[right--]='0';
                chars[right--]='2';
                chars[right]='%';
            }else{
                chars[right]=chars[left];
            }
            left--;
            right--;
        }
        return new String(chars);
    }
}

在这里插入图片描述

六、翻转字符串里的单词(力扣151)

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
在这里插入图片描述
思路:

  • 移除多余空格----数组之移除元素(力扣27)当移除完后记得更新数组的长度
  • 将整个字符串反转------反转字符串(力扣344)
  • 将每个单词反转-----反转字符串中的单词 III(力扣557)

举个例子,源字符串为:"the sky is blue "

  • 移除多余空格 : “the sky is blue”
  • 字符串反转:“eulb si yks eht”
  • 单词反转:“blue is sky the”

难点在于把多余的空格移除

class Solution {
    public String reverseWords(String s) {
        char[] chars = s.toCharArray();
        //双指针法移除多余的空格
        int slowIndex=0;
        int fastIndex=0;
        for(fastIndex=0;fastIndex<chars.length;fastIndex++){
            if(chars[fastIndex]!=' '){
                if(slowIndex!=0){
                    chars[slowIndex++]=' ';
                }
                while(fastIndex<chars.length && chars[fastIndex]!=' '){
                    chars[slowIndex++] = chars[fastIndex++];
                }
            }
        }
        char[] newChars = new char[slowIndex];
        System.arraycopy(chars, 0, newChars, 0, slowIndex); 
        //整个字符串反转
        int left=0;
        int right=newChars.length-1;
        while(left<right){
            char temp = newChars[left];
            newChars[left]=newChars[right];
            newChars[right]=temp;
            left++;
            right--;
        }
        //将单词反转
        String res = reverseWords(newChars);
        return res;
    }
    public String reverseWords(char[] ss) {
        int i = 0;
        int j = 0;
        for(;j<ss.length; j++){//跳到下一个单词的起始位置
            if(ss[j]==' '){
                //反转单词
                int left = i;
                int right=j-1;
                while(left<right){
                    char temp = ss[left];
                    ss[left] = ss[right];
                    ss[right] = temp;
                    left++;
                    right--;
                }
                i=j+1;
                j=i;
            }
        }
        int left = i;
        int right = ss.length-1;
        while(left<right){
            char temp = ss[left];
            ss[left] = ss[right];
            ss[right] = temp;
            left++;
            right--;
        }
        return String.valueOf(ss);
    }
}

在这里插入图片描述

七、左旋转字符串(剑指Offer58-II)

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
在这里插入图片描述
思路:
参考上一题:整体翻转+局部翻转

class Solution {
    public String reverseLeftWords(String s, int n) {
        char[] chars = s.toCharArray();
        //整体翻转
        int left =0;
        int right=chars.length-1;
        while(left<right){
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right]=temp;
            left++;
            right--;
        }
        //局部翻转
        //翻转第一部分
        int left1=0;
        int right1 = chars.length-n-1;
        while(left1<right1){
            char temp = chars[left1];
            chars[left1] = chars[right1];
            chars[right1]=temp;
            left1++;
            right1--;
        }
        //翻转第二部分
        int left2=chars.length-n;
        int right2 = chars.length-1;
        while(left2<right2){
            char temp = chars[left2];
            chars[left2] = chars[right2];
            chars[right2]=temp;
            left2++;
            right2--;
        }
    return String.valueOf(chars);
    }
}

在这里插入图片描述


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

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

相关文章

Kubernetes ~ k8s 从入门到入坑。

Kubernetes ~ k8s 从入门到入坑。 文章目录Kubernetes ~ k8s 从入门到入坑。1. Kubernetes 介绍。1.1 应用部署方式演变。1.2 kubernetes 简介。1.3 kubernetes 组件。1.4 kubernetes 概念。2. kubernetes 集群环境搭建。2.1 前置知识点。2.2 kubeadm 部署方式介绍。2.3 安装要…

人工智能前沿——玩转OpenAI聊天机器人ChatGPT(免费中文版)

目录 2022 地表最强AI聊天机器人ChatGPT诞生&#xff01;&#xff01;&#xff01; 一、前言 &#x1f384;&#x1f388; ChatGPT是OpenAI开发的一个大型预训练语言模型。它是GPT-3模型的变体&#xff0c;GPT-3经过训练&#xff0c;可以在对话中生成类似人类的文本响应。Cha…

Vite + Vue3 项目中,使用 vw/vh 适配移动端,并通过 Android Studio 打包

目录 1. 使用 vw/vh 适配移动端 1.1 使用 vite 初始化项目 1.2 安装插件&#xff0c;将 px 转化成 vw 1.2.1 在 vite.config.ts 中&#xff0c;声明插件 1.2.2 手写 postcss 类型声明文件&#xff0c;解决 路径爆红、没有提示 1.2.3 tsconfig.config.json VS tsconfig.js…

Java 8 Stream 之 collect() 的奇技淫巧!

前言 本身我是一个比较偏向少使用Stream的人&#xff0c;因为调试比较不方便。 但是, 不得不说&#xff0c;stream确实会给我们编码带来便捷。 所以还是忍不住想分享一些奇技淫巧。 正文 Stream流 其实操作分三大块 &#xff1a; 创建 处理 收集 我今天想分享的是 收集…

核心内参:S参数的三个重要特性——因果性、无源性与互异性

1 从一个报错开始 S参数在射频、高速领域的应用非常广泛&#xff0c;相关知识点也非常多。最近浏览了一本2020年新出版的书《S Parameter for Signal Integrity》&#xff0c;作者是IEEE Fellow、业界大牛Peter J. Pupalaikis&#xff0c;现任职于Teledyne LeCroy。该书写的非…

《Linux运维实战:使用Percona Backup for MongoDB备份与恢复Mongodb数据》

一、备份与恢复方案 Percona Backup for MongoDB 是一个开源、分布式和低影响的解决方案&#xff0c;用于MongoDB分片集群和副本集的一致备份。从版本1.7.0开始&#xff0c;Percona Backup for MongoDB支持物理和逻辑备份和恢复&#xff0c;仅支持对逻辑备份进行时间点恢复。 …

linux支持ipv6

1. kernel config [*] Networking support ---> Networking options ---> <*> The IPv6 protocol ---> 2. test 2.1 /proc/net/if_inet6 查看/proc/net/if_inet6文件是否存在以确定你的系统是否支持IPv6。 如果没有&#xff0c;可尝试如下命令加载IPv6模…

磺化氰化物7酪胺Sulfo-Cy7 TSA,Sulfo-Cyanine7 TSA,Sulfo-Cyanine7 Tyramide

Sulfo-Cyanine7 Tyramide&#xff0c;Sulfo-Cy7 TSA&#xff0c;Sulfo-Cyanine7 TSA&#xff0c;磺酸基-花青素Cy7 酪酰胺产品结构&#xff1a; 产品规格&#xff1a; 1.Packaging specification&#xff1a;5mg, 10mg, 25mg, flexible packaging, including 100mg packaging a…

11.AOP之注解配置

1.使用IDEA创建工程 2.引入项目使用的依赖 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.2.2.RELEASE</version></dependency><depend…

一、计算机网络体系结构(一)计算机网络概述

目录 1.1计算机网络的概念、组成与功能 1.2计算机网络的分类 1.2.1按分布范围分类 1.2.2按传输技术分类 1.2.3按拓扑结构分类 1.2.4按使用者分类 1.2.5按交换技术分类 1.2.6按传输介质分类 1.3计算机网络的主要性能指标 1.1计算机网络的概念、组成与功能 计算机网络的…

PHP单商户视频号对接流程

一、序关联至对应视频号&#xff0c;并在视频号带货直播中使用。 首先&#xff0c;商家需要在微信后台申请自定义版交易组件权限&#xff0c;申请成功后&#xff0c;可以将小程 二、申请开通商户号 等商户号审核之后在操作一下步骤接口调用&#xff08;pro为例&#xff09; 实…

k8s ~ 数据存储、安全认证、DashBoard。

k8s ~ 数据存储。 文章目录k8s ~ 数据存储。8.1 基本存储。8.1.1 EmptyDir。8.1.2 HostPath。8.1.3 NFS。8.2 高级存储。8.2.1 PV。8.2.2 PVC。8.2.3 生命周期。8.3 配置存储。8.3.1 ConfigMap。8.3.2 Secret。9. 安全认证。9.1 访问控制概述。9.2 认证管理9.3 授权管理。9.4 准…

Flink窗口(Flink Window)

上一篇flink watermark讲到Flink 中事件时间和水位线的概念&#xff0c;那它们有什么具体应用呢&#xff1f;当然是做基于时间的处理计算了。其中最常见的场景&#xff0c;就是窗口聚合计算。 之前我们已经了解了 Flink 中基本的聚合操作。在流处理中&#xff0c;我们往…

Neo4j的Java API操作

Neo4j的Java API操作 文章目录Neo4j的Java API操作0. 写在前面1、前置芝士2. 准备工作2.1 为项目引入Neo4j依赖2.2 启动和停止3、Java操作Neo4j4、参考资料0. 写在前面 Linux版本&#xff1a;Ubuntu Kylin 16.04Neo4j版本&#xff1a;Neo4j-3.2.7 CommunityProject Build Tool…

微服务链路追踪SkyWalking(9.2.0)

微服务链路追踪SkyWalking(9.2.0) 链路追踪介绍 对于一个大型的几十个、几百个微服务构成的微服务架构系统&#xff0c;通常会遇到下面一些问题&#xff0c;比如&#xff1a; 如何串联整个调用链路&#xff0c;快速定位问题&#xff1f;如何缕清各个微服务之间的依赖关系&am…

m基于FPGA的GPS收发系统开发,包括码同步,载波同步,早迟门跟踪环,其中L1采用QPSK,L2采用BPSK

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 最早的GPS包含L1和L2两个频段&#xff0c;其中L1上调制CA码&#xff0c;P码以及导航电文&#xff0c;L2上调制P码和导航电文。在实际接收到的GPS信号中&#xff0c;我们除了能够接受到CA码和P码外…

语雀模板测试

Markdown 和快捷键全覆盖 &#x1f4a1; Tips&#xff1a;语雀支持全功能 markdown 语法&#xff0c;可以点击文档编辑页右下角小键盘查看全部支持的语法和快捷键。 支持导入导出 markdown 文件。支持自动识别粘贴的 markdown 格式内容转换为富文本。 行内代码 &#x1f4a1; …

Apache HTTPD 多后缀解析漏洞

Apache HTTPD 支持一个文件拥有多个后缀&#xff0c;并为不同后缀执行不同的指令。比如&#xff0c;如下配置文件&#xff1a; AddType text/html .html AddLanguage zh-CN .cn 其给.html后缀增加了media-type&#xff0c;值为text/html&#xff1b;给.cn后缀增加了语言&…

DBCO四嗪试剂特点整理:Me-Tetrazine-DBCO,甲基-四嗪-二苯并环辛炔

【中文名称】甲基-四嗪-二苯并环辛炔 【英文名称】 Me-Tetrazine-DBCO 【CAS号】N/A 【分子式】C29H24N6O2 【分子量】488.55 【基团】DBCO基团 【纯度】95% 【规格标准】1g&#xff0c;5g&#xff0c;10g&#xff0c;包装灵活&#xff0c;可进行相应的封装。 【是否接受定制…

Linux进程的数据结构

在Linux里面&#xff0c;无论是进程还是线程&#xff0c;到了内核里面统一叫任务&#xff08;task&#xff09;&#xff0c;有一个统一的结构task_struct进行管理。 在程序执行过程中&#xff0c;一旦调用到系统调用&#xff0c;就需要进入内核继续执行&#xff0c;那么讲用户…