代码随想录算法训练营第八天|字符串来了,344.反转字符串,541. 反转字符串II,剑指Offer 05.替换空格151.翻转字符串里的单词

344.反转字符串
思想就是用双指针+一个变量存储暂时的char, 双向指针遍历一遍,进行翻转即可。
唯一注意的就是可以一开始考虑数组长 < 1 的情况,这样直接返回即可。
作为基础入门,也太长自信心了,哈哈哈哈

541. 反转字符串II
小白还是小白,写了好久觉得自己逻辑可清楚,发现还是不对,debug了半天突然想起。string不可变啊!TT 就吧字符串一开始换成了char Array, 然后每次跳 2K 进行reverse.
逻辑清楚之后,还有就是cornerCase的考虑:

  • 如果给的k值大于string的长度怎么办? 题目说明了直接反转整个字符串,如果在面试中,应该是我们面试者应该要考虑到的情形
  • 如果最后一个k 跳转之后大于整个string 长度怎么办? 就要考虑到最后一个right指针应该要有一个限制,最大不能超过整个string长度
  • 还有就是,因为我创建了双指针,为了Rev. 我特地写出去了一个函数,那区间到底是左右是闭还是开?如果是开的那就要保持后面传入的时候那个指针指向的是“无效Ind”
  • 最后一个是我自己最喜欢犯的错误,之前写if + return 很多次,所以这次也习惯了,导致if 之后我没有写else,他就又又又跑到下面的循环去了,那肯定的报错的撒。 这个也是给自己的一个提醒。TT

剑指Offer 05.替换空格
这个卡哥推荐了双指针法: 先从前到后找到所有的space扩容到 加上需要的字符之后的长度,然后在从后往前遍历加上需要的char, 而之所以不从前往后因为空格都加在后面了, 当遍历到需要的值的时候,后面的数值都要同时往后推一个数值,这样又变成O(N2)的复杂度了。
我还是用的普遍的思考模式, 就是创建一个stringBuffer遍历一遍string 遇到space 就Buffer 就Append 一个%20 否则继续往下走。
至于到底用stringBuilder 还是stringBuffer :
stringBuffer 是线程安全的 所以2个线程不能同时调用
StringBuider 相反, 这个如果是刷题我就暂且先不考虑,毕竟他俩连增加都是一样用append。 但是如果咱之后的工作写的代码要涉及要多线程的问题,大家且需要考虑。

151.翻转字符串里的单词
这个之前看过逻辑上的解说: 可以先把所有的stiring反转,之后用两个指针,慢指针做起始点,快指针去寻找空格 ,如果碰到, 就把 中间的字符再反转,然后快慢指针一起跳到后面的一个单词,当快指针找到最后一个时候,结束循环:
eg: [the sky] --> [yks eht] -->[sky eht] -->[wky the]

然后就发现自己naive了,cornerCase啥啥都没考虑到,逻辑不难,就是细节上需要注意的多:

  1. 前后都有空格怎么办? --> 从前往后,从后往前 分别遍历一边删掉
  2. 中间有n个空格怎么办?–>按照答案显示是要踢掉的,那就要再转换前把字符串整理好。再放到reverse里运算

归纳说的倒是很好听, 但是其实有很多要注意的地方:

  • 再反转word的过程中,是有2个判定条件: 第一个是找到了空格,第二个是走到了最后! 否则最后一个即使遍历到了也不能reverse了。
  • 删除中间空格的时候,判定条件是 , 当前的char是空格但是前面一个不是空格, 才需要append space. 这样就可以直接去掉最后的n个space

这道题细节还是蛮多需要注意的

剑指 Offer 58 - II. 左旋转字符串
最简单直白的就是申请额外空间 ,3次遍历string
以 abcde n=2 为例
第一次 把String复制到额外空间 [a,b,c,d,e,’ ‘,’ ']
第二次 把后面多出来的位置赋值上前N个数值 [a,b,| c,d,e,a,b]
第三次 把后面正确的char array拿出来变成string 返回 [c,d,e,a,b]

但是显然是不够滴!我们可以如何再不申请额外空间的情况下完成呢?
方法是和反转单词很相似!
还是以 以 abcde n=2 为例
先反转前2个 bacde
再反转后3个 baedc
最后反转所有 cdeab

这些题目我都定义了一个reverse string的辅助函数,里面都是假设变成了array. 不过卡哥是用了StringBuilder, 觉得也可以多尝试一下,以防面试考到。

最后总结一下 今天的字符串,主要是熟练了 不同形式的反转,以让我们获得最后答案。熟悉了基本操作,明天应该要KMP了 怕怕TT

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值