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

这学期上完数据结构来趁热打铁一下哈哈哈

(刚考完期末之前的过后补上!

344.反转字符串

力扣
我的想法: O(1) extra memory 就是不需要建一个新vector。所以我的想法就是for loop 一下这个vector,注意是从i=0到i < s.size()/2。然后第i位和第size - i - 1(注意这个-1,可以拿几个例子稍微确认一下)交换。这里需要拿一个char temp存一下需要交换的内容,不然会覆盖掉。
代码随想录:用了i和j两个下标分别从头和尾标注并交换,本质原理应该是一样的,但是更直观和方便。另外swap的部分还可以用swap函数,以及位运算(这个知识还没接触过,以后可以留意一下)。
学习一下更直观的reverse写法(主要是i和j的使用):
for(int i = start, j = end; i < j; i++, j--){
    swap(str[i], str[j]);
}

注意input应该是string& s, pass by reference!这样才能有效的改变s。

void reverse(string& s, int start, int end)

 

 

541. 反转字符串II
力扣
我的想法: 我写了一个和上一题类似的helper function,只不过是直接reverse string输出string。然后在reverse function里按照题目要求各种操作。需要注意 c++中 substr是(index, length),我开始想成(index, end index)了于是卡了半天奇怪的错误哈哈哈。
通过了但是时间空间复杂度不行
代码随想录:
1. “在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间”。
2. 在写helper function的时候把start,end作为参数带进去,只需要修改for loop的起始和结束点即可。能大大减轻主方法的工作量。( 事实证明很好用!
3. Reverse string如果没有特殊要求,不用写一个vector。string本身就可以用str.at(i)替换。
4. >= 2k和 k < i < 2k 都是只reverse前k个即可,所以可以合并起来写
5. 注意continue的用法:强行让for loop执行下一次(i += 2k)。所以每次reverse完一部分要记得continue,才会去reverse下一个k。
(一些其他:下一个题写了15分钟还没写完大概就是方法太复杂了。可以直接看一下代码随想录hhh)

 

 

剑指Offer 05.替换空格

力扣
我的想法:新建一个string。对于原string,如果遇到空格就往新string里加“%20“,如果不是就加那一位本身。时间复杂度O(n), 但是空间复杂度需要建一个新string
代码随想录:扩充数组 + 从后向前填充。这时空间复杂度不用建一个新string,只需要resize。
注意扩充的长度是:原size + 空格数*2,因为”%20“ 比 “ “ 【多了】两个字母
一个小问题:注意用if的时候是:if(s[i] == ' '),是双等于

 

 

151.翻转字符串里的单词

力扣

我的思路:先把左右两边的空格trim掉。然后对于trim好的string,每识别到一个完整的单词就放到vector里,最后vector倒序输出。这样不用考虑中间空格多或者少的问题。但是空间复杂度比较高,不能满足在原string上变化的要求。

(虽然但是独立做出来了个medium也算个进步了bro(对我来说

代码随想录:

1. 全部反转 + 每个单词再次反转

2. removeExtraSpace用到了移除元素那道题的思想。我到时候补day 1的时候重点关注一下。今天先看其他两个function。

3. reverseWord时,注意for loop的结束点是:i <= s.size()。这样i == s.size()可以判断到了句尾,而后面reverse的时候用的是i-1,也不会出界。

4. 还需要注意reverse function 的 string&s 应该是pass by reference (同344)

剑指Offer58-II.左旋转字符串

力扣

我的思路:这题如果不限制空间复杂度还是比较简单的,直接substr相加即可。不过要是不说可以用reverse还真的想不到可以用哈哈哈。

代码随想录:

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串

之后就非常清晰了,直接利用之前的reverse方法即可。这样空间复杂度为O(1)

注意:反转整体 + 反转局部不一定有什么顺序,就看题目要求不同需要灵活运用。

整体总结:

这几道题虽然有些方法用的比较暴力,但居然都做出来了哈哈哈,相比于大一还是有了很大进步!(data structure没白上)。接下来的目标就是优化算法 优化空间时间复杂度。加油!

你可能感兴趣的:(leetcode,算法,职场和发展)