00:00
好,这个string的话呢,课后这呢,放了五道这个算法相关的这个题目,这呢就需要大家呢,灵活去使用string当中的常用方法来去解决这些问题,当然解决这些问题之前呢,你得先有一些思路,有了思路以后呢,你再考虑我们调哪个方法去完成你想做的这个事儿啊,这个思路的话呢,其实很重要,这个思路的话呢,又得需要大家去通过多去做一些练习题啊,你去不断的强化和熟悉一些解题的思路,就跟大家编程的这个编程的思路一样,就多写代码就可以了,成那这呢五道题这个我就不一个个都讲了,这个课后的话呢,我这放了一个string的EXE2,这个里边呢,就是关于这五道问题呢,每个答案呢,我都放到这儿了,这儿呢,咱们就挑着呢去讲就可以了啊,这个大家呢下来呢,你可以看一下这里边我没有讲过的这个题,嗯,这儿的话呢,我讲一下这个。呃,其实说说说不都讲,但主要的这个也都讲了啊,234讲一下啊,这个呢,首先看一下这个第二个题CTRLC这呢,我们去新建一个module,嗯,点错了啊。
01:07
重整,因为一个module,这个是咱们这个Java的这个工程,别选错了,然后next这个DAY0次SC下我们去新建一个包。练习的这个包下边呢,我们去新建一个Java文件,诶,这个我们叫string的一个DEMO,好在这呢,咱们来写这几道问题。嗯,说呢,将一个字符串呢进行反转,这个反转的话呢,它还不是说呢,让你把这个完整的那种反转,而是呢进行这个部分指定的从哪一个index到哪一个index的一个反转,好这呢我们就先把这个方法呢,你得先造出来啊public,呃反转以后呢,你把反转以后的这个数据呢给我返回,所以还是个string,这个呢,我们就叫一个reverse。
02:03
啊,那你得告诉我,你想把谁反转,把这个呢子五串呢,给我们填进去,返回一个呢,指定位置反转的,这个反转的话呢,我们刚才提到了,它还不是说呢,整个内容的一个反转,我们是可以指定它的开始的位置叫start一个index,嗯,到它的in型的end的一个index,好,所以大家现在你看去定义这个方法的时候呢,这块呢,大家越来写的越多的话呢,你会比较清晰的去声明这个方法,然后主体的内容呢,都是在写这个方法体,暂时呢,我们先return now,那我们下边就来看呢,怎么去实现啊,怎么去做这个事呢。这举了个例子,嗯,AB,然后此时的话呢,我们这个start index相当于这个C的索引是二,嗯2345,那这个F的话呢,这个相当于我们这个它的索引呢,就对应这个是五,从二到五呢,把它这个字符串呢,给它反转一下,然后再整个呢,生成我们这个前面不变的这些返回。
03:06
这个我们有什么思路去解决啊。对,咱们咱们前面呢讲过,对于这个叉型数组,或者也不一定非得是叉啊,就是对于数组的话呢,一个反转比较清楚,比较熟悉,所以呢,我们这呢,可以把这个字符串呢,改成一个呃这个字符数组的一个问题,呃这呢是相当于咱们解决问题的方式一啊,这个方法呢有很多种啊,此时呢,我们选择呢,就是相当于先转换为这个呃叉形数组,对利用这个数组呢去解决这个问题,那我们就开始来做了啊,这个字符串的话呢,我们转换成差型数组,是不是图叉RV啊。啊,然后al enter一下得到一个呃数组,这个叫AR吧,那数组得到以后,我们现在对这个数组呢进行反转,但反转的话呢,又不用说从这个角标零一直到末尾指定的这个范围反转,我们就写个for in一个啊呃叫X吧,X呢让他去取这个叫start index,然后呢,再来一个Y,叫我们这个int n end index,这呢是初始的两个变量,一个呢是指向这个前边这个索引,一个是后边的,嗯,然后呢,我们需要让这个X是不是加加Y。
04:26
剪剪吧。嗯,就是一个往后走,一个往前走,那么中止条件X小于Y相等的话呢,就别判断了,相等呢,你就是交换完它俩,那不是自己换自己就别换了,好,那在这种情况下呢,我们AR,嗯,这个先得取一个叉型的一个ta是吧?嗯,然后呢,叫AR2XARY,然后呢,这个AR y ta呢替换一下。这样是不是就把这个交换了,这样的话呢,我们交换呢,就是指定的你这个范围的,嗯,这个字符了,其他的没有变,那么得到完我修改完以后,我们这个这个这个string以后哈,最后我们做一个return的返回,返回的人家需要的是个string,怎么有个string把我们AR扔进去是不是就OK了。
05:23
哎,这就成了。哎,这个题目呢,其实就做完了啊,那么这个题目的话呢,我们把这个主主体的这个逻辑呢,就搞定了,那有的时候你还考虑到这个健壮性的一些问题,比如说这个HR万一呢,用户调这方法的时候呢,传进来是一个no。或者呢,就传进来一个这种,哎双引号,这里边其实什么也没放,这其实就没啥意思了,所以呢,我们这个机遇的前提呢是呃这个,哎我们呢,先CTRLX一下啊,我们先写一个if呗,如果我们这个S2呢,它是不等于no的,不no呢,也有可能是它这里边你像我们要定一个字符串,长这个样子,它是不是闹啊。
06:03
不是no,但里边呢什么也没放是吧,我这不是个空格啊,就是这个双引号完了又双引号了,那这呢,我们说如果你不是no说接着并且啊,哎,它呢还得是哎不等于我们的这这种形式的这种啊,或者你说它这个点烂也行,它呢得不等于零是吧。哎,在这种情况下呢,我们做了一个这个操作啊,那如果说呢,你要是闹了。你是闹的,或者说呢,你你不是no,但是你的长度是零的,这个我们就。嗯,其实就交换没啥意思了,这个我们就直接return一个这个这个not得了,比如就这样是吧,返回的就什么也没有了啊。嗯,或者这样也也不好,是闹的话呢,这要返回它要是本身里边什么也没写的,那就还接着返回一个双引号里边什么也没有得了,那就还给它放进去是吧,只不过放进去的时候呢,你这时候呢,呃,To差二瑞这时候呢,其实造了一个差人数的长度是零了,其实这里边呢,可能会也会出现一些这个角标越界的情况啊,那该出的话呢,就那个你就给他正常报就可以了啊,我们这个家呢,实际上它有个快速的一个处理机制,你要是闹的话,直接就给他闹了啊,这个写完以后呢,我们做一个测试,测试呢,我写到这个,我写到下边吧。
07:25
哎,Test,这个是咱们这道问题叫res。哎,我们放到这alt enter一下,导入我们这UNIT4。行,那么咱们这块呢,去调一下这个rewards,那我需要呢,有这个string的这个HR不妨呢,我们就叫它。好,接着我们就调这个rewards的方法,把itr呢放进去,这呢,咱们刚才说了是从二到五啊,然后呢,Al enter一下,返回一个新的rewards以后的这个字符串来rewards,它呢去s out一下啊看一下。
08:07
那这时候返回的就是AB啊,看过我们这个要求的啊,F fe DC啊GOK,这就成了。没问题吧,嗯,好,这呢是我们解决的这个方式一啊,然后呢,你看一下还有没有其他的方式。放哨。那这个大家下来呢,应该都是需要呢去想一想的啊,就解决这个问题的话呢,你看你有几种思路去解决,那有了思路以后呢,你看你能不能都实现,都实现了,你再去对比一下谁的效率高啊,这个都是可以考虑的问题了,还可以怎么办呢。对,可以把它看成是一个build build那怎么处理啊,Build,然后build有一个呃,Rewards方法是吧,当然那你这块呢,只能是。
09:03
如果的一部分啊,可以就是有同学想着就是说我把这段的这个内容,就是原有字符串中这一段这个区域呢,我给它取出来,取出来以后呢,我们把它放在这个呃,String buffer当中,或者呃,你要是这个string builder效率高一点,用它是吧,不涉及到多线程问题,然后呢,Ribu rewards一下翻转了,翻转完以后呢。判断完以后呢,让他得到一个字符串,然后再拿前边这个往后边这个去拼是吧。嗯,对,其实呢,呃,感觉上是挺简单的说我掉rewards了,不用你这样去写了,其实rewards里边呢,也是像数组一样这样的去处理的了。是吧,哎,也是这样去处理的啊。那么比如我不调这个rewards了,因为如S它把这个给你封装起来了,那咱们自己呢,去稍微体现一下这个所谓的rewards这个过程啊,那就可以这样去处理了,那这个咱们呢,直接呢,相当于就是使用谁呢,就是这个string它的一个拼接操作啊。
10:13
行,还是这个方法,CTRLC,只不过呢,我这块都保留一下,我这叫REVERS1了,怎么办呢?嗯,你看我们这个字符串啊,把它呢,指定的一些一段呢,进行了一个翻转,其实呢,我可以把这个字符串呢分成三部分,第一部分呢,就是大家掉线了是吧。好了是吧,我们这个四符串的话呢,其实可以看成是三部分啊,第一部分的话呢,就是你这个index之前的这部分AB属于不变的,然后呢是这一段呢,变的,在后边一段呢又不变的,把这个分成三部分,所以我这块呢,可以这样,首先我这呢生明一个string,我就叫做这个rewards的一个str,它呢先是谁呢?先是我们这个str的一个subst string,这个subs string呢,就是从头开始一直到呢,你这个叫呃,Start in,因为咱们这个呃从哪到哪就是前包后不包的,所以我这样写呢,没有问题。
11:18
对吧,相当于我们这个时候呢,就你拿这个题目去考虑把AB是不是取出来了,嗯,然后接下来呢,我们把后边这个呢,内容呢,也得加到咱们这个,哎呃,这个rewards的it tr当中,这个我们就可以这样来处理了,我写一个for循环,这个for循环呢,我倒着去取咱们这个第二部分,相当于呢,我们让这个I呢,先是等于叫N的index,然后让这个I呢,不断的去减减,从后往前去变利,那这个终止条件,哎哟,大于等于start index。好让这个第二步呢,从后往前去遍历,我就取每一个字符,让这个字符呢,拼接到咱们现有的这个rewards SR当中。
12:07
加等于AT2点叉艾,哎,把这个I放进去。这不用的都是我们string的一些方法,这样的话呢,我们把第二部分是不是就搞定了。然后接着呢,第三部分,那这相当于是这个第一部分啊,就是没有变的这个部分,然后这呢是我们的这个第二部分,后边呢,可能还会有一个第三部分。第三部分直接呢,我们把它拼接起来就可以了,我们直接呢调reverse s tr,它呢再去加,等于一个咱们原有的它的一个sub string。这时候萨呢,你就指定一个这个开始位置,一直让它到末尾就可以了,这个怎么写。N index是不是得加个一啊,从它的后一位开始,一直到末尾拼接起来,这样的话呢,我们就搞定了,直接呢去return一下我们rewards的str,这就成了。
13:10
哎,跟上面这类似,你把它呢,也放到我们的一个,呃,衣服里边,说itr呢,它不等于闹的时候,哎这样去处理。哎,这样,然后呢,如果你要是个no,直接return一个no,哎这样就OK了,这呢是咱们这个第二种方式。那第二种方式这个呢,叫REWARDS1啊,在这我们测试一下。哎,你看一样。啊,也是OK的啊,这里边的话呢,是咱们自己呢,写了一个这个从我往前的去遍历啊,其实没有去调这个数组了,哎,没有把它转换成个数组,呃,在内存方面呢,相较于我们刚才写的第一种方式呢,诶第一种方式啊这个哎内存使用层面呢,这个呢,现在你去新造了啊,这个呢,看似在这块呢,实际上是没有新造的,感觉上呢是省这个内存了,但事实上呢,如果呢,咱们还记得咱们这种操作呢,在现有的变量的基础上拼接的,是不是每次都得新造一个对象了,所以这个效率呢,其实并也并不高,哎,也并不高啊,那相比这个稍微再高一点。
14:27
啊,又去讲咱们昨天讲咱们那个前几天讲的这个关于这个string相关的啊,还有string bar string builder,对于后两个bar和string builder来讲,它并不会说你每次加一个内容我都给你新造了,因为它是可变的是吧,所以呢,我们要想这个在这二的基础上呢,再好一点,实际上呢,你是不是可以用这个string buffer或者是string builder去替换我们这个里边的string呢?诶可以这样来处理,哎,相当于在这个方式二的基础上呢,我们再进行一个优化方式三,方式三呢,咱们就可以去使用这个string buffer,或者呢是string builder,就看你具体是不是涉及到一个多线程的问题了,它呢来替换咱们的string啊,就是这个相当于是在二的基础上的一个优化啊。
15:20
那么这个方法的声明呢,我们还是用它CTRLC,嗯,还用它啊,那这里边的话呢,我们用string b还是build呢?就看是不是涉及到多线程问题,如果没有,没有用谁对build呗。哎,等于new一个词钝的一个build,好,那我这时候呢,用个构造器,我用谁呢,我用这个。哎,就是我们这个字符串呢,用户可能写的会比较长,比较长的时候啊,特别长,几十个,甚至这个更长,那么我们底层造这个build的时候,咱们讲buff分的源码分析说过啊,Buff分的build底层一样,它呢默认的时候是只有16个,那你这块呢,想让他这块去体现的话呢,你回头还扩容倒挺麻烦的,干脆我第一次定义的时候就跟你长度一样,这样的话呢,就效率更高一些。
16:18
好,这样写,这样完了以后。啊,咱们接下来呢,需要把原有的这个string当中的三部分呢,分别的放进去,那第一部分呢。第一部分,第一部分呢,咱们可以这个你写一个这个for循环,也可以就是跟类似于这块一样啊,写个for循环,从零呢到这个呃,Study index前面这个索引位置,呃去取每一个那个chart的元素,把它呢aend到我们这个里边啊或者我这块呢,我就这个直接一点,我直接呢就调一个这个openend了,Openend方法里边我们调一下itr呢,它有一个叫subs string,诶我们就从零开始呢,到这个叫诶start index。
17:01
看看能不能看懂,哎,Open呢有个方法,它呢直接可以放一个字符串,我们这儿的话呢,就把我们这个,诶,String当中的这个从头开始到study index本身呢,取头不取尾,相当于是它的前一个啊,哎,添加到我们现有的这个里边了,这就是第一部分。第一部分好,第二部分,第二部分呢,我们还这个build呢,我们去这个这个添加它,第二部分呢,要换反转的了,那反转的话呢,这个我们可以借用一下上面这种操作了,诶把它呢CTRLC一下,哎这样在这里边我们拿这个build呢,哎让他呢去点一个这个叫openend,把我们哎这个string它的叫char at指定的I位置上的元素给它呢,Openend到现有的build当中。这个操作显然它的效率比这个呢要高很多,对吧?嗯,这个呢,不断的去创建新的,抛弃旧的,这个呢还是在原有的这一个底层的查询数字中操作的这个效率要高一些,这呢是第二部分,然后接着第三部分,哎,我们呢,还是在已经拼接得到这个build的基础上再做openend,那只需要呢,将我们这个XR它的subs string从我们叫n index加上一的位置一直到末尾看做一个操作就OK了。
18:29
那么我们得到这个builder呢,底层就是我们这个想要的那个字符串了,但是呢,我们需要是一个string,哎,我们需要做一个转换,我们可以拿着这个buildl点调一个叫to string的方法就搞定了,整个这块呢,我们也是把它呢CTRLX放到一个if当中。哎,这是这么着,然后呢,这块我们就成一个now,哎这就可以了是吧,那这块呢,说提示reverse,它is already啊啊定义过这个了,我们写个二,然后这呢,我们改成是个二测试。
19:12
哎,行,这个呢也是满足的,OK,这呢是我写了这样的三种方法啊,这个方式三呢,是在方式二的基础上呢进行了迭代,那除此之外呢,还有其他的一些方式方法,大家呢,可以都下来多想一想,你呢先别局限于这个效率,先去想想这个有几种方式去解决,把这个思路呢打开,你可能在这道问题中这样写可能不太好,但是你换到别的题目中这样写可能就挺好的,这个思路呢,其实也很重要啊,那么接下来呢,你再去想哪个效率高一点,哪个低一点,就相当于你得考虑一下这个效率了,你得想一想底层它是怎么设计的。啊,得这样。
我来说两句