00:00
好,那么这块完了以后的话呢,咱们看一看啥呢,看一看我们这个string的相关的这个课后练习题了,OK,哎把这个呢就关掉了,首先呢来看第一个题。这个呢,实际上是考察我们这个参数传递机制的,这里边儿呢,要体会一下我们这个string的这种不可变性。来看看这个题会不会做。这呢是当前这个类的对象的创建调change方法,Change方法调这个,然后呢,把当前这个对象的两个属性呢传进去里边呢,做了一个操作,操作完以后呢,再出来把这两个属性打印一下。看看内部呢,有没有影响到他。首先看第一个HR把good。这是我们的属性啊。把它呢,传给这个HR。然后里边呢。重新赋了,值了。那么出来以后呢,我们这个IR。是多少?是good吗?还是test OK。
01:01
注意对这块呢是good。没问题是吧。啊,这个注意一下啊好,然后呢,我们这时候把这个叉型数组传过去了。差异数度传过去了,里边呢,把CH啊这个数字角标零改成B了。那么出来以后呢,我们这呢,是test还是best?这个给改了。啊,这个确实给改了。所以呢,这个结果呢,是这样子的,来跑一下。哎,就是这样。OK啊好,这块我们再稍微的看一下这个HR呢,我们传给这个HR传过来的,你说是什么呀。对,记住这个结论,咱们前面说的结论呢,都是没问题的,凡是呢,涉及到这种参数传递机制的基本数据类型,就传这个数据值。银税类型呢,就传地址值。传地值还是把地址传过来了,说白了你这个HR呢也是一样good,但是呢,你修改的话呢,我们就要不可变形了。
02:04
所以呢,你就是你自己呢,你要改,那你自己再造个底。再去造个test OK,常量池里边去生成一个,然后呢,我这个呢还是good。不受影响。所以这块呢,你注意一下这个点啊,然后后边这个呢,传过也是地址传过来地址了,然后呢,你这个操作呢,这就拿着地址操作我们空间里边这个test了,把它呢从T改成B了。然后这块就这样,所以这块呢,诶万变不离其宗。记住这个不可变性,记住我们叫支传递机制,这个呢,遇到什么问题,你就该怎么分析,还怎么分析,小心一点就可以了。就没问题,好,然后我们来看这个第二个题。第二题这块呢,其实就涉及到了一些小的算法问题了,包括呢,大家有兴趣呢,你刷一下这个立扣啊,立扣里边呢,也有些这种关于字符串的一些算法问题啊,然后这儿呢,我就简单的罗列了五道题。这五道题呢,这个时间关系咱就不一个个去讲了,这讲花的时间会多一些啊,这五道题呢,现的这种答案呢,哎,从上往下五道题都有答案,我就都放在这了,咱们这儿呢,我就挑着呢,咱们说一下。
03:10
第一个呢叫模拟一个处理方法,去除左面两端的空格。这个我就不说了。啊,这个呢,你相当于呢,就是比如我们像刚才那会儿举例的时候呢,说的是hello,前边呢,后边不会有一些空格吗。哎,这个你就判断一下开头这个是不是空格,就是是不是有我们这个短横线是吧,他要是这个短横线呢,你就接着往后取。接着往后取,直到呢,出现不是一个短横线的时候呢,把这个索引记一下。这个呢,从后往前找到,不是的时候呢,记一下缩引,然后取当年这个字符串的一个sub string就可以了。啊,现在的答案呢,我这都有也不说了啊,然后咱们看一下这个第二题吧。第二题来这块呢,咱们自己写啊。关于string的一个。哎,测试。这么着啊。好看这道题会不会?说呢,将一个字符串进行反转,所以这时候反转呢,还不是说完全反转,它只是叫指定的一块区域反转,比如说ABCDEFG。
04:09
他这块呢,是把。这块给翻转了。你看中间这一段。反转了一下。然后前边呢,后边呢没变。嗯。这个把它呢,写成一个方法是吧,那这个方法的话呢,应该是这样的了,咱们就叫做reverse吧。你先告诉我本身的这个串是吧。然后呢,你再告诉我你想把哪一段反转吧。或者你这个加个index也行。诶,就相当于呢,我们调了个方法,调完它以后呢,这个返回值就是我们想要的。啊,然后呢,你可以就是这块做一个测试了。测试这块呢,我们假设啊,就拿当前这个来说吧。哎,我写的呢,是他。
05:00
这样然后呢,咱们去调了一个reverse这个方法,把S呢放进去,这个from呢是。零一是不是从二开始?对啊,逗号一下,然后呢,哎,我们是到这块哈,C呢是二。嗯,345是吧,嗯,这个F呢,角标是五这块呢,就是看你五这块意思是包含是不包含了。如果理解成了包含,那这块呢,这个你就写五呗。这样rewards以后呢,返回一个新的这个字符串。这个比如叫一。啊,那么如果我们去打印这S1,希望这时候你一打印出来了,就是长这个样子了。哎,那看一下这个方法该怎么去设计了。咋弄啊看看。咱们string里边没有这样的方法是吧,你得根据咱们现的这些基本的方法呢,你去给他。营造出来这样一个。
06:00
操作啊。也就是说呢,实际的需求呢,千变万化,最基本的一些啊组件啊,就是咱们刚才讲的那些方法了。这个怎么着?先把谁取出来?先把子串把把这个子串取出来是吗。取出来,然后呢。把to叉位。把租把这个查询速度给反转一下是吧,嗯,那那前后怎么处理。再拼一起是吧。啊。那干脆我就直接把这个字符串先整体转化成是一个叉型数组。然后呢,指定的位置呢,给它转一下,然后再把差异数度呢,再转化成钝不就可以了吗?是吧。诶可以的啊,所以这块呢,我看这呢是一种方式啊,方法其实很多。哎,第一种方式呢,我们可以这样考虑。嗯,我这呢,写成写到这儿吧。
07:00
比如叫方式一,那我们考虑呢,就是将。啊,其实呢,大家呢,写后续的一些代码,包括以后我们写项目也是一样啊这样呢,呃,主要就是怕啥呢,怕你没有思路。一旦你要有思路的话呢,其实这个代码就可以往下推进写了。这个所谓的咱们说Java语言也好,语法也好,呃,其实这个API也好啊,都是咱们的工具,只要你有思路的话,你就往下走就行了。没思路,那就动不了了。这儿呢,我们将什么呀,String呢转为哎,叉型数组。然后呢,诶针对于差型数组。啊,进行啊,相应位置的一个反转。啊,然后呢,再将反转以后啊。啊,然后呢,将咱们这个叉形数组呢,再转为磁针,那就可以了。这个呢,相应的里边这些操作呢,其实咱们都做过了,进一起就行,首先把string转化为char型数组。
08:04
怎么做啊?对,咱不是讲过叫图叉V吧。诶,这个呢,先得到这样的一个差零数组了,然后呢,对它呢,进行一个指定位置的反转,以前呢,咱们讲数组的时候呢,说过从头到尾整体反转是吧,现代化呢,不是整体了,只是其中的一段反转。一段反转咋弄呢?For一个I等于。From index吧,是吧?嗯。再整个街得了。To index就一头一尾是吧,然后这块有个条件,然后I呢加加接呢。减减应该是吧。对,然后这个条件呢,就是他俩呢,就不要碰头了。哎,I小于阶其实就可以等的话呢,你没必要换了是吧,哎,所以呢,I小于阶。那在这里边儿呢,我们怎么处理呢。是不是叉型的一个ta是吧。
09:01
它呢就是我们这个ST点叫char,这呢是from index。嗯,然后呢,诶不不用整它了,这个呢,我直接就插言数组了是吧,AR这块呢I吧。ARI。ARG。姐。Temp。是不是这样?啊,这个呢,我们就把相应的这个相应的位置呢,就做了个交换。哎,这就相当于是就是你把这如果看成是个数组的话呢,这个呢,不就是我们这个from,这个呢是我们这个to,把这个C和F交换一下,然后呢,I呢往后走接往前走,E和E交换一下,然后呢再走,这不就他俩就。不满足这个条件了就结束就完了。好,这是我们说的第二步,然后第三步的话呢。哎,是不是再返回去是吧。怎么反?哎,是不是使用构造器就行。是不是这样就可以了嘛,然后这块我们做一个return是吧。
10:00
哎,这呢,就我们讲的构造器的这个操作了,说过啊好,然后呢,回过来我们去做一个运行。看看是不是我们要的这个结果啊。没问题是吧。那这呢,就我们这道题实现的一个核心的操作了。行。还有别的方法不?比如提示一下啊,这个呢,我们把当前这个字符串呢,实际上呢,是可以分成三部分吧。三部分,前面一部分不变,中间一部分呢,相当于交换一下,然后最后一个呢,这个这一部分呢,也是不变的。那我能不能把你要得到的这样的一个字符串呢,我让他呢,先拿你前面这样的一个子串去。哎,这个赋值是吧,然后的话呢,中间这一部分呢,我们就以拼接的方式呢,从后往前变利这样去取。添加到你现在的这个字符串上,然后呢,再连接上一下你最后这个子字符串。
11:00
是不是也可以啊?对,所以思路的话呢,其实可以比较多的。啊先呢,大家不用过多的考虑这种性能问题啊,我这个高了低了,你先有想法,然后呢,想法多了再看哪个好哪个不好。OK啊,你看我这是什么什么样一个想法呢,这块呢,我。哎,String这个呢,就是我们最终要返回的,咱叫比如要final的HR吧。最终要返回的就是它,首先呢,我让它等于什么呢?就是你传进来一个字符串呢,我来一个叫subs。从零开始到from index。啊,最终你看我要返回的就是这个叫final的这个HR了啊,这儿呢,看到是我们的这个一部分啊,或者你换句话呢,叫获取咱们这个HR的第一部分。第一部分呢,因为他头部这块不是不变吗。嗯,我就先把这个部分取出来,好,这玩意小心一点啊,这个from index这块我这样写的,在我们这个方法里边是不包含这个from index左右开嘛。
12:00
那实际情况呢,这块我们要不要包含呢。是不是也不要包含啊?因为我没法取的时候呢,其实你就只需要把AB取出来,C呢是那个index是吧。正好也不需要,所以这呢就先取出来第一部分,然后呢我们再去。啊,这个拼接上第二部分。这个第二部分呢,就中间我们要换的这一段。这段呢,我们就使用拼接的方式,比如说就写个循环啊,In一个I呢,就等于咱们的from index,然后I呢就小于这块,你考虑要不要等是吧。先写成没等的了,哎呢加加。怎么着怎么着呢,我调这个HT呢叫叉啊,我取指定这个位置上的这个字符,取出来以后呢,吸捏到我们线上的这个字符串上边。是不是也可以是吧,诶平行到这个上面,但是这块你写的话,你注意你是从前往后偏离了。不太对是吧,所以这块你小心点啊,我们这块呢,是不是得倒着来。
13:01
从这块儿呢,得减减。然后这块呢,得让它大于。想一下要不要等是吧。对得需要呢取到这个值,所以这块呢,要这个等行这呢我们就从后往前便利做了个拼接,希望呢最终的效果呢,就是走到呃循环外边的时候呢,AB你把这个fe DC是吧出来。啊,然后呢,接着我们再去拼接上。第三部分。这个呢,我们就finalr,我直接呢就拼接一下你字串呢叫subst string,我就从这个index开始。是不是也不要他呀?应该是不是从F后边那个开始是吧,所以这块是不是应该加个一。啊,这个注意一下,好,这个在平均完以后呢,最后把它返回一下。行,哎,这块呢,我们做这个具体的测试了,再复制一份,这个我们叫S2这个REWARDS1是吧,这个呢,把它也打印一下S2,看一下这个S2这个值。
14:09
看是不是跟上面一样是吧。哎,这呢也是一种方式。那这方式当中的这个第二种,这个第二种的话呢。诶,你考虑一下它这里边儿的这个相应的一些性能是吧,跟第一个呢去比,哎,这个第二个呢。跟第一个比哪个好一点?第一个好,为什么。嗯,就是这个性能啊,咱们比的话呢,其实是可以有这样的这个角度的啊,第一个角度呢,就是编写上的话呢,我们看看哪个简单哪个繁琐一点,就是编写上的,但是编写上繁琐的话呢,它不一定说运行就繁琐。是吧,有的时候运行的差不多啊,这个当然了,第二个角度考虑就是我们主要看的还是运营手的一个性能,运营时的这个性能的话呢,我们主要考虑其实是叫时间复杂度了,当然呢,顺带呢,你可以再看一下这个空间复杂度,如果时间复杂度呢,差不多,你看哪个空间节省的少是吧,用的少,那那个哪个就好一点是吧。
15:09
也就这个角度哈,这个第二种呢,不好在哪儿了呢,是这个位置。这位的话呢,咱们讲过这个加等于或者要加这个,每次这个所谓的加呢,如果你要前后呢,有变量参与了,咱不是前面讲这个string的时候呢,讲过这个拼接操作,只要前后有变量操作了,它是不是相当于都是new的新的组串了。所以呢,如果我们这个区间这块比较长,你看在这个问题当中涉及到有四个,这就意味着我们这块呢,实际上呢,是不是。相当于掉过四次。这个牛。那就是每次呢,你拼接一个字符,然后这块我们得新造一个,再拼接一个呢,又得新造一个,其实这块呢,在内存空间上来讲就比较浪费,同时这个性能速度的话呢,也不算快。所以它呢比较慢,而我们上边那个在交换的时候呢,就是拿着现成的这个差型数组在交换的这个没有新创建这样的一个新的结构,没有新的内存的开辟,那对应的话呢,没有新开辟,还是在原有上面操作,它的速度也会更快一些啊。
16:04
OK,那实际上呢,还有其他的方式啊,比如我们在这个答案里边也有啊,我们像后边呢,讲的这个,哎,String buffer。的时候。那个怪怪的string是吧,哎哎,Buff或者叫builder啊,讲到这个时候呢,它叫可变的字序列了,它呢就可以在你现有的这个。啊,字符串的基础之上呢,你加上一个这个G是吧,然后呢,这个呢,就不用去创建一个新的串了,它这个呢,就比这个要好,我在这里边写答案了,然后咱们还没讲,讲完以后的话呢,大家回过来你再看也可以。好,这呢是咱们这个课后的这个练习的第二个啊,然后呢,我们再看一个这个第三个吧,诶第三个咱们看看怎么写。这块呢是这样说的,说呢,获取一个字符串在另一个字符串当中出现的次数,这块举个例子,比如说获取AB在这样的一个差当中出现的次数。
17:00
啊,这个我们可以自己先看看,比如说这有一个是吧,啊两个啊三个四个,所以这块呢,如果比完以后呢,它应该返回的就是四。那就这样一个概念,哎呀,这个怎么做呢。是吧,这个得考虑考虑啊。诶,这个需求。行这块呢,咱们先把这个方法的声明先写出来,大家目前呢,写方法声明这块应该是比较顺了吧。对吧,咱们当初讲方法的时候呢,发现呢,哎呀,写个方法这块呢,好几个事儿需要考虑,呃,这个花的时间挺多,那以后呢,我们去写相应的功能,其实主要呢,你就是在写这个方法体了,声明这块呢,实际上是会很快的写出来,比如public表示它的访问权限就比较大了,这个要求呢,我们调完以后呢,返回一个次数,所以自然而呢,就是一个in特类型的是吧,这块呢,我们可以呢,比如叫get一个,咱叫一个叫subs string的一个count吧。获取一个子次物串它的一个个数行,那前面这个呢,我们写成是一个,比如说叫str,后边这个呢,咱写成叫sub str。
18:05
现在呢,我们要判断一下后边这个字符串在前边儿这个字符串当中出现的次数。注意这块,我们在写这两个字符串的时候呢,虽然是都是string,但是他俩的先后顺序是有要求的。你要能理解反了,你说判断这个字符串,在这个字符串中出现的次数,那显然就没有了。所以它俩的这个地位不同,注意后边这个呢是子字串,所以在这儿你也可以呢,去相应的这个写明一下。所以呢,我们就会看到相应的方法的前面都会有一个,一般都是一个文档注释的。我们这个呢叫哎判断叫sub str是吧,它呢在SR中。出现的次数。OK啊,然后这个呢,就是我们说,嗯,你要判断的这个呢,是存在的,它这就相应的去描述一下这个return呢,就是返回这个次数啊。好,那么当我们调的时候呢,把这个写到前边,把这个AB呢写到后边,返回去就是个四,这个事儿怎么去做。
19:08
嗯。诶怎么去做,呃,其实呢,这个有一个通俗这个叫什么比较一般的这种做法啊对,就是大家呢,在拿到一些题目的时候呢,虽然说呢,针对于Java呢,我们去写这个逻辑呢,可能大家之前没有做过,经验值为零。对吧,今天之前呢,经验值都是为零了,当然呢,我们学数学也好,这已经都学了十几年的这个时间了,其实你是积累了大量的解决问题的一些思路的,这个呢是经验值,你可以呢,相应的移植过来,每个人的情况不一样,所以移植的场景呢也不一样,这是一种这个可以移植过来的啊,另外一个呢,解决这些问题的思路是什么呢。就是呢,有一种通识的,就是你呢,把它当成是一个别当成是一个编程题了,你就当成是生活当中的一个题,或者说一个数学的题,你看你是怎么。解决这道问题的,然后把解决这个问题的这样一个思路呢,你给他看看能不能用代码的方式给他呈现出来。
20:03
这比较通俗的这样一种想法,比如这块判断AB呢,在这里边出现了几次,你看刚才呢,咱们说四次咋看的呢。是不是就从前往后这样去找是吧。找了个AB,然后呢,接着往后再找A,又找了个AB俩了,嗯,仨了,所以这个两个呀,三个呀四个呀,你肯定要定一个变量了。去记录一下这个次数,然后呢,接着往后再找,那你会发现,当我们找到一个的时候呢,我们再找的时候呢,你是不是就开始从后边开始接着找了。对,然后又找到一个AB呢,是不是再接着从后边开始找。对,这样越来越短,越短,一直到最后。找不到了,那就结束了。那这块呢,我们就看看在这个过程当中,我们应该怎么去调用string当中的相关的方法,帮我们去做这个事儿。当然了,有的同学在说我这块呢,我是怎么着呢,我使劲一看,我就看出来有四个。我从中间到两边是吧,呃,那这个的话呢,那就不好实现了啊。
21:00
嗯,这个呢,你得细微的去找到那样一种感觉是吧,然后去写。好,那这块呢,大体思路来了啊,那就我们首先呢,先有一个count,这个是零,用它呢来记录出现的这个次数。行,然后呢,我们应该是在某些情况下呢,让这个count呢,实现一个加加的操作,最终呢,把这个count呢给他返回一下。这是大体的思路,没问题了,然后关键就是里边这块怎么去处理呢。啊同学想到用,你看这块我们能考虑的点啊,比如说它在这里边出现过没有出现的在哪个位置,这块涉及到的相关方法呢,有这个字符串呢,有叫cons。判断它是不是包含。那也有呢,叫in带恶五。不管判断是不是包含了,还告诉你相应的位置了。是吧,基本上我们判断这里边有没有这个的时候呢,大体量就有这样的一个方法,当然还有last引测,我就从后往前找的,这个我们用哪个合适呢。
22:02
对,用index of合适,光判断有没有的话呢,其实也就只能找到一个是吧。对,当然了,你这块要用就是用content的话呢,其实也未尝不可,当然你也需要对现有的租画进行一个处理了。那咱们一会可以说这种思想啊,这块我们推荐比如我。扔进去完以后呢,是不是又得到一个所谓的索引了。好,那这个所以的话呢,如果它是大于等于零的。那说明就是找到了是吧。那那这块呢,我们就可以去判断了,我先写成叫if了啊,如果呢,它是大于零零的说明找到了,既然找到了,我是不是就count加加了。好,那找到了,这也不是说就这一次啊,那可能还有呢。那得接着找是吧。还得接着找,接着找。然后呢,还得接着判断,那干脆这个位置呢,就写成一个well吧。啊,那在这里边我们再接着找,相当于这就是个迭代条件了,怎么写啊。
23:04
哎,接着从哪找我这HR呢,In so。除了这个叫re,你要这样肯定还是原来这个了,我们是不是从后边再接着找。诶,前一个from index啊从哪开始。我是不是已经在index的位置找到了。但是这块你一定要注意,这个不能写index。也就是说加个一。是加一呢,也不合适哈。加一怎么叫不合适呢?你看我我这样来说吧。比如我这块呢,我有三个A。我要是判断AA在AA当中出现的次数,你说这块是几次。是吧,几次啊。两次啊。其实一次应该合理一些,就是这块我找A的话呢,这不就找到A了吗。你再找没有了,你就说这不一个A吗,你不能这样了,你这个不能重复用。
24:04
不能重复用,所以说这块我们要再找的话呢,应该是比如说这个呢,我们找的是索引零,你不能让它从一开始,如果要从一开始,这不就又有一个了吗。你应该让他从这个你要找的这个串儿的后边这个位置开始,也就是说零应该加上这个aa.les是吧。哎,得这么着,从这个位置开始找。所以说这块呢,我们不能不能让它加一,应该加上我们叫subh2.les。从这开始再接着往后去找,这个注意也就是说我们叫一开始呢,这个索引零这边找到A了,你不能再接着从B这块找,而应该是从K这块开始往后找。嗯,这个要注意行,然后呢,从这个位置开始找,然后看看它存不存在,如果要存在的话呢,是不是接着呢,再返回给我们这个index,然后看看你后边从这个位置开始找的话呢,如果要又找到了,看看这个呢,是不是还是大于等于零的。如果是就接着加加。以此类推,直到了你这块呢,返回是负一了。
25:00
那就相当于这个呢,就没进去了。那这块就退出了,是不是就这么着。看看OK不?哎,这样个思路,行,这个写完以后的话呢,我们下边来这做一个测试。啊做测试,嗯,这个咱们不妨呢,就拿这俩来说事吧,哎,润的这个叫。哎。IR啊,叫AB啊。这个咱们就拿它来说。行,然后调我们这个方法,这个叫get。哎,司令的这个count先写itr。再写这个萨。这么着,然后得到一个count。哎,打印一下我们这个count。好运行。好,那这个呢就出来了,这个就是四。那说明我们这个做法呢,就没有问题,OK,行,然后这块的话呢,你可以稍微的再考虑做个优化啊,你比如说这两个呢,咱们明显也说了,他俩的地位呢,是不一样的了,呃,那杨言之呢,就是至少的话呢,我们现在在判断的时候呢,你这个str它的一个lengths呢,它应该是大于等于我们这个subtr它的一个lengths是吧。
26:15
在这种场景下呢,我们去做这个比较了。诶,我把它呢CTRLX啊拿过来做比较了,那如果说呢,你上来呢,这个它的长度呢,就比这个长度短,你还判断它在这里边几次,那肯定就没有了,所以这块呢,衣服呢就直接不用进去了,直接我们就return一个零是不是也可以。没问题是吧。就这块这样写呢,其实就相当于是我这有个else一样,然后这个位置你写的一个叫RETURN1。然后这个位置上写了个零,那count的本身这块呢,默认值这块是零,所以这块我们就不用去单独去写它了,是吧。就是如果呢,你这个位置呢,诶满足刚才我们这个条件,这个呢,Count自然呢也就变成四了,如果呢,你要没进去的话呢,这个一开始也是零,所以它也是零。就这样来处理就行了。
27:00
好,这个呢,是我们说的这个第二道题,然后刚才呢,不是还提到一个思路呢,说用这个cons的这个思路,就是我们判断它里边呢,是不是包含它。说这种思路呢,可能差点意思,因为呢,似乎呢,Cons只能判断一次,那就是处处完了以后呢。说完了以后呢,其实你可以把这个是不是再处理一下。处理一下呢,就是你不是整个先判断它里边是不是包含AB吗?包含了包含以后呢,接着你再取当前这个字符串的一个子串是吧,子串的话呢,就是你把它截出来subs string的时候呢,从这个位置开始取,然后再判断它里边是不是contains。啊,又包含又包含呢,找到这个位置呢,然后再把它从后边这个位置开始考虑也行。当然这个呢,为啥不考虑呢?因为呢,我们在取这个子串的时候呢,你也得告诉我是从哪个位置开始取这个子串,那你这个位置的话呢,自然而然的是不是就要用这个in so了。那干脆我就直接用你不完了吗。所以这块呢,用它呢就更合适一些,OK,行,那这个题目呢,我们就说到这儿了,那剩下的这些题呢,我就不去讲了,大家呢,你可以下来写一写,这几个里边呢,相对来说麻烦一点的应该是这个第四道题。
28:08
那这个题呢,要干什么呢?就是这两个这个字符串,然后判断呢,下边这个字符串呢,在诶上边这个字符串和上面这个字符串呢,最大的相同子串。比如大家使劲一看。哈,就出来了是吧。哎,这个呢,就是最大的相同字串了。这个怎么去弄呢,我就说一下思路了啊,首先的话呢,这两个字符串呢,没有地位的区别了。不是说它在它里边怎么着,还是它在它里边了,就是两个地位平等的字串,找最大相等字串。嗯,怎么办呢?我们先找到这俩里边比较短的这个,看看这个整个。有没有可能在这里边contains。如果要是肯的话,那整整个这个就是是吧,如果这要不是的话呢,下一步考虑就是我把这个字符串呢,是不是截一个呀。取它的一个subs string解一个的话呢,这就涉及到我是取这个呢。
29:01
还是整体往后移一下,然后是取这个呢。都要考虑是吧?对,这就涉及到循环了啊,循环的时候呢,第一次循环我们就砍掉一个,砍掉一个的话呢,这就相当于是我们可以取subs string的时候呢,呃,这个呢是从头开始,这个呢就是长度减一呗。然后呢,再者呢,你就让他呢,在两个指针都加加一下,然后把头部这个去掉,看这两个呢,在这里边是不是肯子如果还不CS,是不是就该始减两啊。减俩的话呢,这块呢,就可以先这样是吧。是把尾部的俩剪掉嘛,然后再这个指针和这个指针都往后移一下,是不是就变成这样了。啊,这个呢,看有没有,如果还没有再往后移一下,是不是就考虑这个。只要呢,在跟上边这个去要肯定方法呢,如果返回是触了,那就停下来,那就是我们要找的这个了,如果这还没有接着该砍三个了,砍三个话呢,是不是先这么着。然后再往后移一下,就是从这块儿开始到。诶,刚才呢,应该是从这儿到这儿是吧,砍三个哈,然后呢,这块你再接着呢是砍。
30:05
这样是吧,然后再往后移一下这样的一个逻辑行,对应的这个代码的话呢,都写到这儿了啊,大家下来的话呢,你可以呢,去看一看啊,这不是第。在这儿写的。啊,这个呢,我用的是一个string buffer的,然后你可以再看上面这个写法,这个呢,暂时我们还没有讲到这个buffer的是吧,你可以看这个写法OK啊。好,整个呢,关于这个算法问题呢,是一类问题,有的时候呢,在这个笔试当中可能会出现针对于这个数组的啊,针对于string的相关的几个这种小的算法问题啊,这个大家呢。呃,你可以下来呢,稍微练一练就行,这块呢,咱们就没必要呢,说我去赌一下,说看看哪个是高频的啊,你要说呢,咱们前面提到的,比如说等等和E有什么区别是吧,这个sleep和我们这个wait有什么区别,咱说呢,这都算高频的,包括呢,面向对象呢三个特征,这呢肯定是高频的笔试面试题了。
31:00
说高频它一定是极其容易考的,但是你要说哪个算法题是高频的?那说不了啊,这个你要说这道题呢,当是我见过这个出过的。但其他这几道题呢,好像我都很少见这个,有时候跟他类似的这种也见过啊。但是呢,这种呢,咱们就没有必要去赌了。你就实打实的自己的稍微的练一练,熟悉熟悉就OK啊好,然后接着我们看这个第三题。这是这样说的,说呢,模拟用户登录。定义一个用户类啊,有这样的一些基本的。结构啊,接着呢去用数组呢,创建多个用户对象。然后呢,便利一下是吧,然后呢,接下来我们去录入一下用户和密码,这个如果呢,要是都正确了,就要登录成功,诶否则的话呢,登录失败了,登录失败呢,又具体说明你是用户名对了,密码错了,还是说呢,用户名就错了。啊,这个呢,提示的就比较细致一点,咱们一般呢,在实际的使用当中呢,作为用户来讲,一般呢,就是上面这个用户名下边是个密码,呃,你可能是用户名写错了,也可能是密码写错了,反正他报的都是一个信息。
32:08
叫用户名不正确或密码错误是吧。诶,他这个其实相当于是这种逻辑写法呢,就比较省事啊,你要说呢,判断具体一点说是用户名错了,还是密码错了,这个呢,判断的逻辑就会多一些,就比如说咱们这道题。这呢是一个功能演示。啊,我们呢,可以造个数组里边添加几个呃用户,然后呢,把这个便利一下,当你输入的密码用户名都对了,这就对了,然后呢,要是啊,用户名写对了,密码写错了,就这样说。如果那用户名写错了,这个直接就说没有该用户。OK,这样的一个思路啊啊。行,那首先呢,我们去定义这样的一个类。比如这个类呢,我们就叫做这个user类。哎,相关的这个结构我们粘过来。Private类型的叫name。死类型的。诶,Password是吧,这个呢叫密码。
33:03
OK,这个呢就比较简单了,我们提供比如说构造器。空餐的一个。代餐的一个。然后这个盖塞方法。OK啊,然后呢,再来一个。这个哎,苏思人这块的话呢,我们稍微的照顾一下他这里边儿这个。呃,便利是吧,他这个便利的时候,你看用户名密码中间有个短横线,这个呢,我们可以理解成就是它的这个图层操作了,所以你把它那个给改一下吧。就是这个。哎,拼接上一个它。然后呢,加上一个password,诶这么着是吧。可以了,行,其他的就不需要了。就这样,这个大家呢,你会发现呢,我们经常创建这样的结构的时候呢,都是有属性这个构造器盖塞方法一般呢,再配一个to string是吧,像以后的话呢,我们在JDK14当中呢,就会提到一个叫做record。
34:01
啊叫做记录啊,包括呢,我们现在呢,你去新建的时候呢,这是能看。这个是因为我用JDK。八了是吧,这个咱们挑前面的啊,你看我再去new的时候呢,是不是有个叫record。哎,这个记录的话呢,就比较简单的让我们去创建这样的结构了。像这里边儿,你不都有这个构造器,都有盖塞方法,都有to three,它会帮我们自动的去生成。这呢,是一个新特性,OK。咱们还拉回来,现在还老老实实的这样去写,接下来呢,我们来一个测试。哎,User一个test,哎,一个main方法吧。这么着,哎,这里边儿呢,首先呢,我们去创建数组,然后并初始化几个user对象。这么着,假如这块呢,我们就来一个U色形的一个数组了。行,这块咱们整三个吧。那三个假设呢,我们就用这个呢来说吧。行,回过来。
35:00
这里边啊,角标零。那就我们一个呢去创建了。嗯,汤姆。这个是8888是吧。哎,这块你看它是这样写的,这个这样写,其实咱们这儿呢,就我就随便来了啊。当然呢,在数组里边呢,其实是有趣的是吧。比如这个写给他了。123。Jerry。四个六。像我们呢,呃,上节课呢,不是提这个令方法里边提到这个正策表达式嘛,那其实呢,用户呢,在这个客户端的时候呢,填用户名填密码的时候,我们就可以呢,给他加一个校验,就是是不是满足指定的这个正则,你像这种比如说你写光写这个四位就不行啊,他就提示不让过,就至少六位啊,你写了六个八结果也不行,说你这里边呢,没有这个字符是吧,光有这个数字那不行啊,像这个呢,都用正则呢,去校验就可以了。如果呢,你要没有这个验证的话呢,用户就随便写了就。好,这完了以后呢,咱们首先呢,做一个便利啊。
36:03
是。啊啊,这里写错了,这是一个二啊。酷中的用户有。哎,这么着,然后这块我们就直接来一个或循环是吧,AR点一个lengths,这里边我们就直接打印的叫AR角标,哎,相当于呢,调他们的two string的方法,图轮方法呢,刚才已经重启过了,其实呢,就这样个效果也就出来了。好,这个效果出来以后呢,接下来它会有这样的这种提示。哎,回来。下边呢叫请输入用户名,请输入密码这块我们就用这个scanner了。啊,这个呢是实例化啊scanner。然后呢,呃,获取。哎,输入的。用户名和密码好。这块我们就用scanner。
37:03
哎,随这么点印行,这个我们已经都比较熟了。现在把它倒一下。啊,然后呢,为了防止你忘了关,你就先给他写好这个关。然后在这块呢,我们先提示一下说呢,请输入用户名。诶写出名,然后这块来个冒号在后边写的,那你就把这个换行就去了吧。这个通过干。Next的方法。诶,拿到一个叫做。哎,比如叫username是。好,请输入密码,这个咱们就一下呢,都给他拿到吧。密码。Us。Word。好,这就可以了。那下边的话呢,当你输入完用户名密码以后,他就开始做这个校验了。那这块校验的话呢,我们说有这样的几种情况啊,那我们看下这个事儿应该怎么做呢。
38:02
输入的这用户名是不是应该跟我们数组里边的每一个元素的名去匹配是吧。那自然而然的是不是又要循环了?对哈,我们呢,就是便利数组元素,然后呢,匹配用户名和密码。哎,这么着啊,循环。啊,0I呢,小于a2.lis是吧,哎,再加。好,那么这里边儿呢,我们把这个ari这就具体一个user了,是不是get它的这个name啊。让a name呢?是不是调equals了,这个呢,一定注意不能去调,我们这个叫等等啊,另外呢,Equals的时候呢,其实还涉及到一个叫equals in our case,还有呢,就是纯ES的。哎,这个话再去重来一下啊,第二。啊E方法这有两个啊,这两个话呢,就看你怎么考虑了啊,你说的话呢,这个要大家写区分的,那这块你就用上面这个,你要不区分就掉下边这个。啊,这个呢,就是具体问题大家具体看了啊,你要不去问就调下边那就行了。
39:02
好这时候呢,我们就把你输入的这个叫username呢,就放进来,那一旦呢,发现呢,要是有这样的一个等的关系。啊,有等等的关系呢,还不行,咱们这块呢,是不是还得考虑密码得一样是吧。嗯,那这个逻辑看你怎么设计呢。有人可能说我就直接在这块洗了是吧。这块呢A,然后呢,这个叫get,一个叫password了点是吧,这个呢我们叫。诶password就我们输入的说,用户名和密码都得一样,都一样的话呢,这块我们就说叫登录成功是吧。可以打印一下。哎,登录成功逗号。这个登录呢,应该是这个登录啊。选第二个吧。其实我看有一些网站的那个登录都用的这个,这一看那个就语文没整好是吧。是诺曼底登陆了。啊,这个登录啊。
40:00
好,登录成功,然后加上一个username。啊,这样的一个方式了,嗯,这个呢叫登录成功,那其实呢。另外的这个情情况呢,就是登录失败了,我们有时候看这个网站的话呢,他就只告诉说你登录成功不成功的话呢,他就说用户名不存在或者密码有误,那就相当于呢是。哎,有点像前面,比如加个波尔类型的变量,然后这块一旦成功了,把那波尔型变量改一下,顺便呢,你这个break一下出来呢,判断这个变量呢,是不是改过值,直接的说你失败了。他没有告诉你是用户名不对还是密码不对是吧。对,因为这种的操作呢,比较省事。我就判断你是不是俩都满足,只要俩都有一个不满足的,那就算失败。咱们这块呢,咱们整的细致一点。说一下是到底用户名问题还是密码的问题,那看看这个怎么做。你看这个呢,我是把他俩都是满足的,算了是吧,然后接着你就得考虑用户名对了,密码还不对是吧。
41:00
啊,那干脆我这样得了。我把这个呢,就直接删了哈。删了以后呢,在这里边儿我继续呢去考虑。对这个呢是用户名先是对了是吧。存在此用户名。好在这个情况下呢,我再去判断一下。对你这个AR,哎,就咱们刚才写的啊,Get一个password equals,咱们这个password这个呢,如果也是进去了。这个呢,再把咱们刚才那句话呢写一下。登录成功。加上一下这个叫username,然后这块呢,其实是可以break了是吧,跳出我们这个循环了,就没必要再接着去历了。那否则的话,这个呢,是已经找到这个用户名了,那你就拿着他那去匹配就可以了,咱们在一个呃,系统当中呢,其实用户名你说都一样,密码不一样的算不同用户,这不行,只要用户名存在了,就不让让他再去注册了。
42:00
所以呢,只要找到这用户名了,接着我就去判断一下密码,只要不一样,是不是这块就可以判断了。对,这个呢,就叫密码有误。哎,这样就行。行这个呢,密码有误。还需要再接着往后走不?其实也不用了是吧。就是他一旦这个用户名判断了是这个用户名以后呢,不管你这个密码对了不对了,实际上是不是都得结束啊。写这儿吧。理解是吧?好,这个呢,我们存在这个用户名,然后呢,在这里边有个逻辑了。然后呢,要是不存在呢,找了一个I没靠谱,I又加,加了又不靠谱,整个人也没找到,怎么叫没找到。没有该用户怎么表达?是不是可以去定一个。Word类型的一个变量。Is flag。这个呢,先写上出吧,其实什么意思啊,就是说我们看下这个循环它到底是怎么结束的啊,你是通过这个break结束的,那就意味着是你找到这个用户名了。
43:05
你要是通过这个循环条件没满足,结束的说明就是没找到呗。啊,那其实就判断这个I呢,是不是这个ar.las了,但这个I呢,我不是给写到这儿了吗?就一种方式呢,你把它提出来,这个判断I呢,是不是这个ar.las。一种的话呢,就是这块我们写个波尔型的变量,然后呢,呃,只要你找到这个用户名了,我们就给你。是不是改一下。你看对吧。我就改下这个值,哎,这就说明了我找到你了。然后出来以后的话,我们在这判断一下叫is flag,看看它是不是还是true,它如果要是true呢,说明就没进去过。没进去过,说白了就是我们没找到这个用户吧。所以这个时候呢,我们就直接呢,输出一下说。没有。该用户。是这个逻辑吧。嗯,所以这块呢,我们如果说要给清楚是用户名写错了,还是说密码写错了,这个处理起来逻辑呢就要复杂一点,最后呢,做一个close行完事了啊来我们去一下。
44:07
这块呢,我们添加了是不是有三个用户,请输入用户名,比如Tom。密码写一个对的啊,四个八。这个呢叫登录成功再来一遍。这个写一个汤姆。密码呢,我就随便来一个了。哎,密码有误是吧。再来这块,我们写一个叫啊托尼啊。这个呢,就随便来了。没有该用户是吧。没问题吧?哎,这个呢,就是我们这道题的一个做法啊。好,这个下来的话呢,大家可以呢,写一写这样的一个题目,那实际上我们在开发当中啊,咱们不会把这个数据呢,就存储到这个内存里边了,那一断电没有了,所以我们或者说呢,你这样写的写死了都啊这个数据的话呢,我们都是在数据库当中,所以呢,一开始的这个操作呢,我们实际上呢,是通过数据库呢做个查询,查完的结果呢,放到我们内存当中,可能是一个数组,也可能是我们后边讲的一个集合。
45:00
然后呢,还是从集合或者数组里边来判断一下,是不是存在对应的逻辑呢,跟这个类似。那么至此的话呢,咱们关于string哈,这个类本身相关的一些事儿呢,咱们就都讲完了,应该说的比较多,OK。
我来说两句