代码随想录第七天(541、剑指05)

news2024/9/19 23:48:33

文章目录

  • 541. 反转字符串 II
    • 发现了三个基础知识的问题
    • 看答案改进
  • 剑指 Offer 05. 替换空格
    • 答案方法1
    • 答案方法2
    • 知识点
      • 一、
      • 二、
      • 三、
  • 总结

541. 反转字符串 II

发现了三个基础知识的问题

第一个

这个题目发现了一个非常大的问题,有点不知道自己的Java基础到底有多少窟窿要去补……太可怕了
一开始我写的代码中对字符串的长度的写法是:
在这里插入图片描述
然后出现错误提示:
在这里插入图片描述
这个时候我发现,正确的写法应该是:

int length=s.length();

因为length是一个方法啊!你如果不加括号,那和一个属性怎么区分呢?


第二个

在反转数组时,想对数组中的元素进行交换操作,我写的是:
在这里插入图片描述
但是提示错误:
在这里插入图片描述
也就是说,字符串不能像字符数组一样访问数组中的某个元素,字符串不是数组,想要进行这种操作,需要先将字符串转换为字符数组,用字符串的toCharArray()方法,然后字符数组转换为字符串,比较简单,可以直接new:

char[] c=new char[]{'a','b','c'};
String str=new String(c);

第三个
一开始我在写代码的过程中,检查了很多遍,都没有问题,但是就是结果不对,后来发现是对字符串的知识掌握不牢固,在自定义方法中是相对字符串元素进行交换,但是如果这是不产生一个新的字符串来存储交换后的内容而是直接输出方法中的形参的字符串,字符串并不会改变,因为字符串在底层是由数组存储的,而数组具有不变性。
错的代码:

class Solution {
    public String reverseStr(String s, int k) {
        int length=s.length();
        if(length<k){
            return reverse(s,0,length-1);//正确
        }else if(length>=k&&length<2*k){
            return reverse(s,0,k-1);
        }else{
            int num=0;
            while(num<length&&(num+k)<length){
                reverse(s,num,num+k-1);//虽然生成了新的字符串,
                //但是没有用字符串接收这个新的字符串,可以直接赋给s
                //这样s就存储了新的字符串
                num=num+2*k;
            }
            if((length-num)<k&&(length-num)>0){
                reverse(s,num,length-1);//不正确,首先s此时还是
                //没有交换的字符串,其次,应该直接在语句前面加上return,
                //不然新的字符串根本没机会返回
            }
            if((length-num)>=k&&(length-num)<2*k){
                reverse(s,num,num-1);//不正确,同上
            }
            return s;//目前返回的是老的字符串,根本没有进行任何改变
        }
    }
    
    public String reverse(String s,int start,int end){
        char temp;
        int length=end-start+1;
        char[] c=s.toCharArray();
        for(int i=0;i<(int)(length/2);i++){
            temp=c[start+i];
            c[start+i]=c[end-i];
            c[end-i]=temp;
        }
        return new String(c);//这里返回的是新的字符串
    }
}

正确的:

class Solution {
    public String reverseStr(String s, int k) {
        int length=s.length();
        if(length<k){
            return reverse(s,0,length-1);
        }else if(length>=k&&length<2*k){
            return reverse(s,0,k-1);
        }else{
            int num=0;
            while(num<length&&(num+k)<length){
                s=reverse(s,num,num+k-1);
                num=num+2*k;
            }
            if((length-num)<k&&(length-num)>0){
                return reverse(s,num,length-1);
            }
            if((length-num)>=k&&(length-num)<2*k){
                return reverse(s,num,num-1);
            }
        }
        return s;
    }
    
    public String reverse(String s,int start,int end){
        char temp;
        int length=end-start+1;
        char[] c=s.toCharArray();
        for(int i=0;i<(int)(length/2);i++){
            temp=c[start+i];
            c[start+i]=c[end-i];
            c[end-i]=temp;
        }
        return new String(c);
    }
}

看答案改进

答案的意思是,因为题目有很多相似的处理过程,可以考虑对for循环进行一个修改,答案的代码真简单,厉害
主要省代码的地方就是,在end这个指针的处理上,即判断剩下的节点还够不够k个
答案简化思路:先设置一个头指针,每次for循环都加上2k个,然后指定尾指针,尾指针是根据头指针+k个-1的位置大小和字符数组最后一个元素的位置大小进行比较,取最小值,然后判断头指针和为指针的大小来决定是否进入循环,循环中是交换两个元素,不管情况怎样,最后返回一个新建的字符串

但在写代码过程中,又发现了一个问题,就是对数组来说,如果写成:
在这里插入图片描述
会报错:
在这里插入图片描述
也就是说,数组中是没有length这个方法的,因为他根本就不是一个类,而是基本数据类型,所以根本就没有方法,数组的工具类是Arrays,不过就算是数组的工具类,也没有length这个方法!因为length是数组中的一个属性,根本不用方法就可获得

根据答案思路改写的代码:

public String reverseStr(String s, int k) {
        char[] c=s.toCharArray();
        int start,end;
        for(int i=0;i<c.length;i+=2*k){
            start=i;
            end=Math.min(c.length-1,start+k-1);
            while(start<end){
                char temp=c[start];
                c[start]=c[end];
                c[end]=temp;
                start++;
                end--;
            }
        }
        return new String(c);
    }

剑指 Offer 05. 替换空格

答案方法1

class Solution {
    public String replaceSpace(String s) {
        if(s==null||s.length()==0){
            return s;
        }
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++){//可以直接用s.length()这个方法在这
            if(s.charAt(i)==' '){//注意,这个方法的返回值,还有单引号
                sb.append("%20");
            }else{
                sb.append(s.charAt(i));//这里也可以直接写,把cgarAt方法包进去
            }
        }
        return sb.toString();
    }
}

答案方法2

class Solution {
    public String replaceSpace(String s) {
        if(s==null||s.length()==0){
            return s;
        }
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++){//这里是将新建的StringBuilder
        //的空间大小设为s中空格的两倍
            if(s.charAt(i)==' '){//一个空格
                sb.append("  ");//添加两个空格
            }
        }
        //其实还有别的办法,比如先遍历一下s中有几个空格num,然后最后创建的
        //时候,用s.length()+num*2也行
        String newStr=sb.toString()+s;//这样新建的字符串大小就是
        //将s中所有的空格替换为%20后的大小
        char[] ch1=s.toCharArray();
        char[] ch2=newStr.toCharArray();
        int left=0;
        int right=0;
        while(left<s.length()){//这个方法是从头开始添加元素
            if(ch1[left]==' '){
                ch2[right++]='%';
                ch2[right++]='2';
                ch2[right]='0';
            }else{
                ch2[right]=ch1[left];
            }
            left++;
            right++;
        }
        return new String(ch2);
    }
}

知识点

一、

一开始做这个题,想到了用字符串的方法:replaceAll(),然后又碰到了一个小问题,就是:
在这里插入图片描述
出现错误:
在这里插入图片描述
说明不能前面是字符,后面是字符串,前面既使用字符串的双引号,中间也可以只放一个字符,但是如果两个一个用单引号,一个用双引号,就出错,因为这个方法的两个参数都是字符串类型的:
在这里插入图片描述

二、

1、这个题看答案中都用到了StringBuilder,而且都用到了Stringbuilder的toString()方法,这个方法返回的是字符串,也就是返回的是StringBuilder中的具体内容
2、在答案的方法1中用到了charAt()方法,这个方法是String中的,返回的是char型,所以要注意两边的 类型要一致,一开始写成了:
在这里插入图片描述
出现错误:
在这里插入图片描述
都是因为类型不匹配造成的,首先第一个错误是左边是一个char,基本数据类型,这时 = = == ==比较的就是具体的值,而引用数据类型比较的是地址
第二个左边是一个String,右边是一个字符,不能这样赋值

三、

答案方法2中用到了双指针方法,思想是:先通过新建一个空间为将空格替换为%20后大小的字符串,将新的字符串和旧的字符串合并之后赋给s,然后一个指针指向原来的带有空格的旧字符串的末尾索引,一个指向新的空的字符串的末尾索引,然后两个指针一起移动,如果旧的字符串中是空格,新的字符串中就加入% 2 0,然后两个指针前移……(前提是已经转换成了字符数组),这时选择前移是因为,就的字符串在开头部分,而如果要将就的字符串中的空格改成%20,就需要将空格后的部分后移。

其实这个题也可以从头开始添加,这种情况需要不将两个字符串合并,这时不用后移元素,直接向后一个个添加即可

字符串转换为字符数组时使用toCharArray()方法,将StringBuilder转换为char数组,可以先通过用toString()方法,将StringBuilder转换为String,然后再转换

总结

1、数组中的属性有length,直接写s.length==0即可,但是String中没有这个属性,只有方法,所以是s.length()==0
2、在基本数据类型中 = = == ==比较的是具体值,而引用数据类型中比较的是地址值,比较内容的话要用重写后的equals()方法,而String中已经重写过了
3、几个方法:
String中的toCharArray():将String转换为char数组
new String(ch):将char数组的内容新建成一个字符串
String中的toString():返回一个字符串
String中的charAt(i):找String中的索引为i的元素
String中的replaceAll(a,b):参数两个都是String类型
StringBuilder中的toString():返回一个字符串,可将StringBuilder转换为String
4、String的不变性:
如果在传入String 的s后,对s进行修改,改完后没有将修改后的字符串赋给s,而是直接将sreturn,这时的s和原来的没有改变,这也是这两个题中,在return时,基本上都是:return new String(ch); 的原因

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

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

相关文章

C++ 20 新特性 ranges 精讲

C 20 新特性 ranges 精讲 C20 中的 ranges 库使得使用 STL 更加舒适和强大。ranges 库中的算法是惰性的&#xff0c;可以直接在容器上工作&#xff0c;并且可以很容易地组合。简而言之&#xff0c;ranges 库的舒适性和强大性都源于它的函数思想。 在深入细节之前&#xff0c;…

程序员的7个被动收入途径——我如何每月赚 5万

每个人都想过时间和财富自由的生活&#xff0c;世界上有70亿人&#xff0c;但只有不到18000人能做到这一点&#xff0c;大多数人一生都在为钱工作。 研究表明&#xff0c;全世界65.8万富人至少有三种收入来源&#xff0c;而且都是被动收入。换句话说&#xff0c;大多数富人知道…

Create Realtime-chat app

Tech:React,Node.js,Socket.io,MongoDB styled-component ​​​​​​​ 目录 Base setup Register funcitonality Login funcitonality set Avatar/profile picture Chat container setup useEffect basic hook ChatHeader ChatInput ChatMessage Set socket an…

I.MX6ULL裸机开发笔记2:镜像文件

目录 一、boot ROM程序 二、镜像文件五要素 三、芯片手册 四、芯片手册数据解读 1、空偏移 2、IVT表 3、DCD表 一、boot ROM程序 选择内部启动方式&#xff0c;启动boot ROM程序 初始化时钟&#xff0c;外部DDR3从外部存储介质加载代码 boot ROM程序是芯片厂…

十五天学会Autodesk Inventor,看完这一系列就够了(十一),放样和螺旋扫掠(绘弹簧)

众所周知&#xff0c;Autocad是一款用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;现已经成为国际上广为流行的绘图工具。Autodesk Inventor软件也是美国AutoDesk公司推出的三维可视化实体模拟软件。因为很多人都熟悉Autocad&#xff0c;所以再学习Inventor&…

Redis缓存数据 | 黑马点评

目录 一、什么是缓存 二、添加Redis缓存操作 三、缓存更新策略 缓存的更新策略 ​编辑 业务场景 主动更新策略 案例 四、缓存穿透 1、是什么 2、解决方案 &#xff08;1&#xff09;缓存空对象 &#xff08;2&#xff09;布隆过滤器 &#xff08;3&#xff09;其…

【春节安全保障有我们】安全狗春节放假值班通知

兔年纳福 辛勤拼搏了一年 终于迎来了福兔吉祥年 众人沉浸于准备过年的氛围中 却有些人为春节期间的网络安全担忧 因为春节也是不法分子们 伺机而动、“搞事情”的“好时机” 2023 NEW YEAR 不得不防的安全风险 1、主机安全遭受威胁 &#xff08;云&#xff09;主机系统…

Rust语言基础

安装 Rust 官网&#xff1a;https://www.rust-lang.org/Linux or Mac: curl https://rustup.rs -sSf | sh Windows: 按官网指示操作 Windows Subsystem for Linux: curl --proto ‘https’ --tlsv1.2 -sSf https://sh.rustup.rs | sh 查看是否安装成功 rustc --version 更…

【openEuler】x2openEuler工具使用

文章目录一、关于x2openEuler二、工具准备三、前期准备1、安装CentOS72、下载x2openEuler3、安装x2openEuler4、执行bash5、访问上述网站6、安装x2openEuler-client&#xff08;1&#xff09;在CentOS-7.6Evetything1上找到x2openEuler-client&#xff08;2&#xff09;把x2ope…

Android Studio 支持手机投屏电脑

有时当我们在线上做技术分享或者功能演示时&#xff0c;希望共享连接中的手机屏幕&#xff0c;此时我们会求助 ApowerMirror&#xff0c;LetsView&#xff0c;Vysor&#xff0c;Scrcpy 等工具。如果你是一个 Android Developer&#xff0c;那么现在你有了更好的选择。 Android…

蓝桥杯--快排+队列+尺取法

&#x1f603;这只松鼠如约而至 - 许嵩 - 单曲 - 网易云音乐 &#x1f603;你买菜吗玫瑰 - 要不要买菜 - 单曲 - 网易云音乐 &#x1f603;一起玩吧这世界那么多人&#xff08;电影《我要我们在一起》主题曲&#xff09; - 莫文蔚 - 单曲 - 网易云音乐 前言 这是我在CSD…

一文讲透单点登录架构思想(SSO)

目录什么是单点登录&#xff1f;非单点登录架构单点登录架构什么是CAS单点登录SSO演进1.同域2.同父域3.跨域CASCAS术语CAS场景单点登录优缺点优点缺点什么是单点登录&#xff1f; 单点登录(SingleSignOn&#xff0c;SSO)&#xff0c;就是通过用户的一次性鉴别登录。当用户在身份…

【数据结构与算法理论知识点】 4、树和二叉树

4、树和二叉树 逻辑结构 4.1、树的定义和基本术语 树是n个结点的有限集 树的其他表示方式 基本术语 根——即根结点&#xff08;没有前驱&#xff09; 叶子——即终端结点&#xff08;没有后继&#xff09; 森林——指m棵不相交的树的集合&#xff08;例如删除根节点A后的…

Apache Solr 9.1-(二)集群模式运行

Apache Solr 9.1-&#xff08;二&#xff09;集群模式运行 Solr是一个基于Apache Lucene的搜索服务器&#xff0c;Apache Lucene是开源的、基于Java的信息检索库&#xff0c;Solr能为用户提供无论在任何时候都可以根据用户的查询请求返回结果&#xff0c;它被设计为一个强大的文…

synchronized锁升级

假如 synchronized 是「王」身边的「大总管」&#xff0c;那么 Thread 就像是他后宫的王妃。「王」每日只能选择一个王妃陪伴&#xff0c;王妃们会想方设法争宠获得陪伴权&#xff0c;大总管需要通过一定的手段让王「翻牌」一个「王妃」与王相伴。 今日听「码哥」胡言乱语解开…

1. Linux 磁盘管理(分区、格式化、挂载)

目录 1. Linux 内核版与发行版 2. Linux中磁盘的管理(分区、格式化、挂载) 2.1 磁盘定义、分类和命名 2.2 分区的定义和划分 2.3 磁盘格式化(高级/逻辑格式化) 2.4 挂载操作 1. Linux 内核版与发行版 内核版&#xff1a;Linus Torvalds最初组织很多人完成的Linux操作系统只…

Ubuntu20.04下安装显卡驱动

环境配置 系统: Ubuntu 20.04 CPU: i5 GPU:Geforce 960M Ubuntu安装显卡驱动 1、查看当前显卡安装情况 使用glxinfo查看 https://dri.freedesktop.org/wiki/glxinfo/ $ glxinfo Command glxinfo not found, but can be installed with: sudo apt install mesa-utils需要安…

postgresql FDW概念、用法与原理小结

最近突然遇到了一批使用fdw的场景&#xff0c;整理记录一把。 一、 强大的FDW FDW (foreign-data wrapper&#xff0c;外部数据包装器)&#xff0c;可以让我们在PG中使用SQL查询极为丰富的外部数据&#xff1a; 本实例和其他pg实例中的pg库主流关系型数据库&#xff1a;Oracle…

装饰模式(decorator-pattern)

装饰模式(decorator-pattern) 文章目录装饰模式(decorator-pattern)一、手抓饼点餐系统二、要求进阶三、装饰模式概要四、装饰模式的优劣及应用场景1. 优点2.缺点3.应用场景一、手抓饼点餐系统 请设计一个手抓饼点餐系统&#xff0c;支持加配菜&#xff0c;比如里脊、肉松、火…

C++ STL

目录 1.STL诞生 2.STL概念 3.STL六大主件 4.STL容器 算法 迭代器 5.容器算法迭代器初识&#xff0c;vector 5.1vector存放内置数据类型&#xff0c; 5.2vector存放自定义数据类型&#xff0c;解引用.访问&#xff0c;指针->访问&#xff0c;存放自定义数据类型指针。迭代器…