Day12 代码随想录 刷题记录

总结:

今日刷题2题,总计用时3h45mins。

字符串操作中,对于数组的具体值的移动与定位分析得不是很清楚;对于双指针的使用还不够熟悉。

替换数字

自己的想法:
每个数字都被替换为了number,即每遇到一个数字就向后推这个字符串的长度。

遍历整个字符串,如果遇到的字符串的值是数字,则在该位置进行insert的操作?

(字符串能进行该操作吗?)

正确的做法:
首先先确认字符串里存有的部分,再扩展数组,再从后往前进行移动与填充。

整体思路的通用性:数组填充类的问题,都是先扩展数组到应有的长度,然后再从后往前进行填充。

扩展数组的用法:

s.resize(s.size() + count * 5);//扩展数组的长度

 注意:

1.不是一遇到循环就扩充数组,进行一次的填充工作。而是整体找到到底有多少个数字之后一次性来进行扩充。

2.自己在解答的过程中把number赋值的部分复杂化了,其实只需要从后往前的填充方式就可以。直接找到新的数组的长度,然后直接采用-- 的方式来完成对于数组的赋值。

3.在新的while值的判断中,循环的条件是while(oldIndex>= 0)。下面则是运用newIndex --的方式进行填充。要找到相关的Index对应的值才算条件明了。

中间对应的逻辑关系要明了。采用对于原字符串的遍历,所以while的判断肯定是以原字符串的判断为基础的。

4.低级错误:‘1’打了单引号,但是‘9’没打。

151.翻转字符串里的单词

自己的想法:

单词不变,句法的顺序发生了改变。

移除空格(erase函数)的时间复杂度是O(n),在这道题目中并不适用。

正确的做法:
移除多余空格,将整体字符串翻转,再将单词本身进行翻转。

补充知识点之 可能用到的erase的用法:

(1) 删除指定位置开始的字符
// 删除从位置 7 开始的 5 个字符
str.erase(7, 5);  // "Hello, !"
(2) 删除单个字符(使用迭代器)
// 删除第 5 个字符(逗号)
str.erase(str.begin() + 5);  // "Hello World!"
(3) 删除字符范围(使用迭代器)
// 删除位置 5 到 7 的字符(", ")
str.erase(str.begin() + 5, str.begin() + 7);  // "HelloWorld!"

比较容易想到的移除元素的做法是:先用识别代码中可能存在的空格,如果有就使用erase函数移除掉。

难点:移除双指针操作中的空格。

使用双指针操作的话时间复杂度降低,应该主动培养这种思维模式。

双指针的写法:使用快慢指针,快指针进行判断识别题目要求的字母,慢指针负责获取快指针指向的值+自行添加空格。

for (int i = 0; i < s.size(); ++i) { //

        if (s[i] != ' ') { //遇到非空格就处理,即删除所有空格。

            if (slow != 0) s[slow++] = ' '; //手动控制空格,给单词之间添加空格。slow != 0说明不是第一个单词,需要在单词前添加空格。

            while (i < s.size() && s[i] != ' ') { //补上该单词,遇到空格说明单词结束。

                s[slow++] = s[i++];

            }

        }

    }

这段代码写得真的很好,品了好一会儿才看懂想表示的意思。。

如果在双重循环中使用的两个的循环条件都是相同的值(在这里是fast),则要考虑好这里的双重循环可能并非普通的关系。

另外注意:

1.在去除多余的空格后,得到的值还要进行:

s.resize(slow); //slow的大小即为去除多余空格后的大小。

才能够消去所有的空格。 

2.在做题过程中,删除空格部分的函数头部分忘记使用 引用版本的s。

void removeSpace(string &s)

  • 按引用传递:函数直接操作原始字符串对象

  • 函数内的修改(如删除空格)会直接影响调用处的原始字符串

  • 内存开销小(不创建副本)

直接导致了结果错误。

所以在涉及到字符串的操作的时候,应该总是使用引用传递来修改原始字符串。 

另外补充一下reverse函数相关的用法:

void reverse(string& s, int start, int end){ //翻转,区间写法:左闭右闭 []

        for (int i = start, j = end; i < j; i++, j--) {

            swap(s[i], s[j]);

        }

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值