剑指 Offer - 字符串合辑

news2025/1/18 16:55:36
🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123

题解目录

  • 一、🌱[剑指 Offer 05. 替换空格](https://leetcode.cn/problems/ti-huan-kong-ge-lcof/)
    • 🌴解题
  • 二、🌱[剑指 Offer 58 - II. 左旋转字符串](https://leetcode.cn/problems/zuo-xuan-zhuan-zi-fu-chuan-lcof/)
    • 🌴解题
  • 三、🌱[剑指 Offer 20. 表示数值的字符串](https://leetcode.cn/problems/biao-shi-shu-zhi-de-zi-fu-chuan-lcof/)
    • 🌴解题
  • 四、🌱[剑指 Offer 67. 把字符串转换成整数](https://leetcode.cn/problems/ba-zi-fu-chuan-zhuan-huan-cheng-zheng-shu-lcof/)
    • 🌴解题


一、🌱剑指 Offer 05. 替换空格

  • 题目描述:请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
  • 来源:力扣(LeetCode)
  • 难度:简单
  • 提示:
    0 <= s 的长度 <= 10000
  • 示例 1:
    输入:s = “We are happy.”
    输出:“We%20are%20happy.”

🌴解题

  1. 字符数组
class Solution {
    public String replaceSpace(String s) {
        int num=0;
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i)==' ')
                num++;
        }
        char[] ans=new char[s.length()+(num*2)];

        num=0;
        for (int i = 0; i < s.length(); i++) {
            if(s.charAt(i)!=' '){
                ans[num]=s.charAt(i);
                num++;
            }if(s.charAt(i)==' '){
                ans[num]='%';num++;
                ans[num]='2';num++;
                ans[num]='0';num++;
            }
        }
        return new String(ans);
    }
}
  1. 可变字符串
class Solution {
    public String replaceSpace(String s) {
        StringBuilder ans = new StringBuilder();
        for(Character c : s.toCharArray())
        {
            if(c == ' ') ans.append("%20");
            else ans.append(c);
        }
        return ans.toString();
    }
}

在这里插入图片描述


二、🌱剑指 Offer 58 - II. 左旋转字符串

  • 题目描述:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

  • 来源:力扣(LeetCode)

  • 难度:简单

  • 示例 1:
    输入: s = “abcdefg”, k = 2
    输出: “cdefgab”
    示例 2:
    输入: s = “lrloseumgh”, k = 6
    输出: “umghlrlose”

  • 提示:
    1 <= k < s.length <= 10000

🌴解题

  1. 自己写反转,反过来再反过来反过来😂
class Solution {
        public String reverseLeftWords(String s, int n) {
        StringBuilder ns=new StringBuilder(s);
        reverseString(ns,0,s.length()-1);

        reverseString(ns,0,s.length()-n-1);
        reverseString(ns,s.length()-n,s.length()-1);
        return ns.toString();
    }

    private static void reverseString(StringBuilder ns, int i, int length) {
        while (i<length){
            char tem= ns.charAt(i);
            ns.setCharAt(i,ns.charAt(length));
            ns.setCharAt(length,tem);
            i++;length--;
        }
    }
}

在这里插入图片描述

  1. 直接使用API
class Solution {
    public String reverseLeftWords(String s, int n) {
        return s.substring(n,s.length())+s.substring(0,n);
    }
}

在这里插入图片描述


三、🌱剑指 Offer 20. 表示数值的字符串

  • 题目描述:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。
    数值(按顺序)可以分成以下几个部分:
     1.若干空格
     2.一个 小数 或者 整数
     3.(可选)一个 ‘e’ 或 ‘E’ ,后面跟着一个 整数
     4.若干空格
    小数(按顺序)可以分成以下几个部分:
     1.(可选)一个符号字符(‘+’ 或 ‘-’)
     2.下述格式之一:
      2.1至少一位数字,后面跟着一个点 ‘.’
      2.2至少一位数字,后面跟着一个点 ‘.’ ,后面再跟着至少一位数字
      2.3一个点 ‘.’ ,后面跟着至少一位数字
    整数(按顺序)可以分成以下几个部分:
     1.(可选)一个符号字符(‘+’ 或 ‘-’)
     2.至少一位数字
    部分数值列举如下
    [“+100”, “5e2”, “-123”, “3.1416”, “-1E-16”, “0123”]
    部分非数值列举如下
    [“12e”, “1a3.14”, “1.2.3”, “±5”, “12e+5.4”]

  • 来源:力扣(LeetCode)

  • 难度:中等

  • 提示:
    1 <= s.length <= 20
    s 仅含英文字母(大写和小写),数字(0-9),加号 ‘+’ ,减号 ‘-’ ,空格 ’ ’ 或者点 ‘.’ 。

🌴解题

  • 只能说,很复杂!
class Solution {
    public boolean isNumber(String s) {
        boolean ans=false;
        int len=s.length();
        int dot=0,e=0;// .  e  次数
        int loce=len+1;// e 的位置
        for(int i=0;i<len;i++){
            //err 字符
            if(s.charAt(i)<'0'||s.charAt(i)>'9'){
                if(s.charAt(i)!=' '&&s.charAt(i)!='+'&&s.charAt(i)!='-'&&s.charAt(i)!='e'&&s.charAt(i)!='E'&&s.charAt(i)!='.')
                    return false;
            }
            if(s.charAt(i)>='0'&&s.charAt(i)<='9'){
                ans=true;
            }

            if(s.charAt(i)=='.'){
                if(i>loce)
                    return false;
                dot++;
                if(dot>1)// . .
                    return false;
                if(i==0&&i==len-1)
                    return false;
                
                //.前或后非数字
                if((i==0 && (s.charAt(i+1)<'0'||s.charAt(i+1)>'9')))
                    return false;
                if((i>0 && (s.charAt(i-1)<'0'||s.charAt(i-1)>'9'))
                        &&
                        (i<len-1 && (s.charAt(i+1)<'0'||s.charAt(i+1)>'9')))
                    return false;
            }

            if(s.charAt(i)=='e'||s.charAt(i)=='E'){
                if(i==0)return false;
                e++;
                if(e>1)
                    return false;
                loce=i;
                if(i>0&&(s.charAt(i-1)<'0'||s.charAt(i-1)>'9')&&s.charAt(i-1)!='.')
                    return false;
                if(i==len-1)
                    return false;
                if((s.charAt(i+1)!='+' && s.charAt(i+1)!='-'))
                    if(s.charAt(i+1)<'0'||s.charAt(i+1)>'9')
                    return false;
            }

            if(s.charAt(i)=='+'||s.charAt(i)=='-'){
                if(i!=0)
                    if(s.charAt(i-1)!='e'&&s.charAt(i-1)!='E'&&s.charAt(i-1)!=' ')
                        return false;
                if(i==len-1)
                    return false;
                if(i<len-1&&(s.charAt(i+1)<'0'||s.charAt(i+1)>'9')&&s.charAt(i+1)!='.')
                    return false;

            }

            if(s.charAt(i)==' '){
                //前面有数字 内容
                if(i>0){
                    while(i<len){
                        if(s.charAt(i)!=' ')
                            return false;
                        i++;
                    }
                }
                //first 0
                if(i==0){
                    while(i<len && s.charAt(i)==' ')
                        i++;
                    if(i<len)//空格后有内容
                        i--;
                }
            }
        }

        return ans;
    }
}

在这里插入图片描述

  • 找了个简短的,欣赏欣赏!
class Solution {
    public boolean isNumber(String s) {
            return s.trim().matches("[+-]?((\\d+(\\.\\d+)?)|(\\.\\d+)|(\\d+\\.))([eE][+-]?\\d+)?");
    } 
}

在这里插入图片描述


四、🌱剑指 Offer 67. 把字符串转换成整数

  • 题目描述:写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数
    首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
    当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
    该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
    注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
    在任何情况下,若函数不能进行有效的转换时,请返回 0。
    说明
    假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

  • 来源:力扣(LeetCode)

  • 难度:中等

  • 提示:
    本题与主站 8 题相同。

🌴解题

class Solution {
    public int strToInt(String str) {
        if(str.length()==0)return 0;
        boolean negative=false; //false
        List<Integer> list=new ArrayList<>();
        int i = 0;

        if(i==0)//去除空格字符串
        while (i < str.length() && str.charAt(i) == ' ')
            i++;
        if(i==str.length()) return 0;
        if (str.charAt(i)!='+'&&str.charAt(i)!='-'&&(str.charAt(i)<'0'||str.charAt(i)>'9'))
            return 0;//前面出现非数字 字符
        else{
            if(str.charAt(i)=='-') {
                negative = true;i++;
            }else if(str.charAt(i)=='+') {
                negative = false;i++;
            }
            while(i < str.length() && str.charAt(i)!=' '){
                if(str.charAt(i)<='9'&&str.charAt(i)>='0')
                    list.add(str.charAt(i)-'0');
                else break;
                i++;
            }
        }

        if(list.size()==0)return 0;
        int lengthn=0;
        for (int j = 0; j < list.size(); j++) {
            if(j==0&&list.get(j)==0){
                while(j < list.size() && list.get(j)==0)
                    j++;
            }
            lengthn++;
        }
        if(lengthn>11)return (int) (negative?-Math.pow(2,31):(Math.pow(2,31)-1));
        long ans=0,k=1;
        for (int j = 0; j < list.size(); j++) {
            ans+= list.get(list.size()-j-1)*k;
            k=k*10;
            if(!negative && ans>Math.pow(2,31)-1)//正数
                return (int) (Math.pow(2,31)-1);
            if(negative && ans>Math.pow(2,31))//负数
                return (int) (-Math.pow(2,31));
        }
        return (int) (negative?-ans:ans);
    }
}

和上一题比反过来是吧
在这里插入图片描述


🌱 加油!

返回第一页。☝


☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓

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

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

相关文章

[笔记]C++并发编程实战 《二》线程管理

文章目录 前言第2章 线程管理2.1 线程管理的基础2.1.1 启动线程2.1.2 等待线程完成2.1.3 特殊情况下的等待2.1.4 后台运行线程2.2 向线程函数传递参数 前言 第2章 线程管理 本章主要内容 启动新线程等待线程与分离线程线程唯一标识符 好的&#xff01;看来你已经决定使用多…

使用压缩包安装jdk多版本并能领过切换

使用压缩包安装jdk多版本并能领过切换 1.下载2.解压包到指定位置3.使用pdate-alternatives 进行版本切换管理3.1. jdk173.2. jdk1.8 3.切换版本4.解决JAVA_HOME环境变量识别的问题 1.下载 官网的下载地址&#xff1a; 下载地址&#xff1a; jdk17: jdk1.8在当前页面的下面: …

基于差分进化算法的微电网调度研究(Matlab代码实现)​

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MAC突然打不开Notion,你遇到过这个问题吗?

目录 解决办法 为什么Notion会突然打不开呢&#xff1f; Notion是一款适合记录/规划的应用&#xff0c;而且页面简洁&#xff0c;模板强大&#xff0c;深得大家喜爱。我也经常在Notion上制定计划、记录学习笔记等。不过&#xff0c;今天突然打不开了&#xff0c;网页版、本地…

基于SpringBoot的生鲜管理系统的设计与实现

背景 困扰交易市场的许多问题当中,生鲜交易管理一定是交易市场不敢忽视的一块。但是管理好生鲜交易又面临很多麻烦需要解决,例如有几个方面:第一,生鲜市场往往人数都比较多,如何保证能够管理到每一个商家,如何在工作琐碎,记录繁多的情况下将生鲜交易的当前情况反应给领导相关部…

【大数据】Hadoop高可用集群搭建

知识目录 一、写在前面&#x1f495;二、Zookeeper安装✨三、Hadoop配置✨四、Hadoop HA自动模式✨五、HA脚本分享✨七、结语&#x1f495; 一、写在前面&#x1f495; 大家好&#xff01;这篇文章是我在搭建Hdfs的HA(高可用)时写下的详细笔记与感想&#xff0c;希望能帮助到大…

分布式调度XXL-JOB

分布式调度XXL-JOB 1.概述 1.1什么是任务调度 比如: 某电商平台需要每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放一批优惠券某银行系统需要在信用卡到期还款日的前三天进行短信提醒某财务系统需要在每天凌晨0:10分结算前一天的财务数据&#xff0c;统计汇总 以…

【图床】SpringBoot上传图片

知识目录 一、写在前面✨二、新建开源仓库✨2.1 新建仓库2.2 将仓库设置为开源2.3 生产私人令牌 三、代码实现&#x1f604;3.1 工具类3.2 上传图片 四、总结撒花&#x1f60a; 一、写在前面✨ 大家好&#xff01;我是初心&#xff0c;很高兴再次和大家见面。 今天跟大家分享…

【Unity】Animation Playable Bug、限制及解决方案汇总

【Unity】Animation Playable Bug、限制及解决方案汇总 先自荐一下我的PlayableGraph监控工具&#xff0c;比官方的Visualizer好用得多&#xff1a;https://github.com/SolarianZ/UnityPlayableGraphMonitorTool Bug 文中提及的各项Bug及解决方案的最小化测试工程可在此仓库下…

基于java的竞赛预约管理信息系统的设计与实现

背景 本系统提供给管理员对首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;项目分类管理&#xff0c;竞赛项目管理&#xff0c;赛事预约管理&#xff0c;系统管理等诸多功能进行管理。本系统对于用户输入的任何信息都进行了一定的验证&#xff0c;为管理员操作提高…

2023语言与智能技术竞赛开辟“双赛道”:寻找“全民测评官”,探索AI多模态能力...

开年以来&#xff0c;人工智能大语言模型&#xff08;LLM&#xff09;掀起新一轮全球科技竞赛&#xff0c;全球科技巨头打响“百模大战”。当大语言模型正深刻改变人类生产生活方式时&#xff0c;该如何进一步释放其潜能&#xff0c;成为业界关注的问题&#xff0c;也成为了202…

计网之HTTP请求的构造

文章目录 1. form表单请求构造2. ajax请求构造3. Postman的简单使用 常见的构造 HTTP 请求的方式有以下几种: 直接通过浏览器地址栏, 输入一个 URL 就可以构造出一个 GET 请求.直接点击收藏夹, 得到的也是 GET 请求.HTML 中的一些特殊标签也会触发 GET 请求, 如: link, script…

线程池ThreadPoolExecutor底层原理源码分析

线程池执行任务的具体流程是怎样的&#xff1f; ThreadPoolExecutor中提供了两种执行任务的方法&#xff1a; void execute(Runnable command)Future<?> submit(Runnable task) 实际上submit中最终还是调用的execute()方法&#xff0c;只不过会返回⼀个Future对象&am…

【项目实战】基于Vue3+TypeScript+Pinia的后台管理系统(coderwhy)

是基于Vue3、Pinia、VueRouter、Vite、ElementPlus、TypeScript、Echarts等后台系统 效果 项目地址 https://gitee.com/yangyang993/vue3_ts_cms_admin.git 超级管理员 登录 系统总览 侧边栏是动态形成的&#xff1a;动态路由加载。路由地址路径和菜单相匹配。 注意&…

CAN总线上的报文帧类型(N_PCI)

1.四种报文类型&#xff08;简洁明了&#xff09; 请记住对于CAN报文来说&#xff0c;可以通过识别每条CAN的首个字节来确定它的类型&#xff0c;4种&#xff1a; 单帧 0 首帧 1 连续帧 2 流控帧 3 2. 单帧&#xff08;SF&#xff0c;Single Frame&#xff09; 0X 单帧首个…

【Spring MVC】后端处理多文件上传如何保持最大的灵活性

文章目录 前言找文档Spring MVC 如何接收多文件formdata 接收其他传参结论 前言 有一个多文件上传的需求&#xff0c;翻看了Spring MVC的官网&#xff0c;总结一下&#xff1a; 如何根据版本号找官方文档后端如何声明Controller能保持较好的灵活性 找文档 spring-framework…

Hive基础概论

HIVE 基础 Hive基础什么是Hive&#xff1f;为什么用Hive&#xff1f;Hive与Hadoop的关系Hive架构、组件组件用户接口元数据存储Driver驱动程序&#xff0c;包括语法解析器、计划编译器。优化器、执行器执行引擎 数据模型Data ModelDataBase 数据库Tables 表Partitions 分区Buck…

LIMUML04数据标注(note)

数据标注的思维导图 目标&#xff1a;是提升模型还是提升标注&#xff0c;本小节讨论提升标准&#xff0c;提升模型后面介绍。 如果有足够标注&#xff1a;使用半监督学习 没有足够标注&#xff0c;有足够预算&#xff1a;请人标注 没有足够预算&#xff1a;使用弱监督学习 问题…

每日学术速递5.22

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Drag Your GAN: Interactive Point-based Manipulation on the Generative Image Manifold(SIGGRAPH 2023) 标题&#xff1a;拖动你的 GAN&#xff1a;生成图像流形上基于点的交互…

基础IO(总)

接口介绍 open&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode); pathname&#xff1a;要打开或创建的目标文件 fla…