关于 反转字符串
- 空间问题:c++的字符串可以原地修改,Java和python语言的字符串不可以,需要额外空间。这里用到的额外空间是没关系的,不影响原地修改的做法。
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
- 这段代码是用来交换数组s中第i个元素和第j个元素的值的。它使用了异或运算符(^),它的作用是对两个二进制数的每一位进行逻辑异或,即相同为0,不同为1。例如,5 ^ 3 = 6,因为5的二进制是101,3的二进制是011,异或后得到110,即6。
这段代码的原理是利用了异或运算的以下性质:
1、任何数和自己异或都等于0,即x ^ x = 0
2、任何数和0异或都等于自己,即x ^ 0 = x
3、异或运算满足交换律和结合律,即x ^ y = y ^ x,(x ^ y) ^ z = x ^ (y ^ z)
所以,当执行第一句s[i] ^= s[j]时,相当于把s[i]和s[j]的值异或后赋给s[i]。此时s[i]变成了原来s[i]和s[j]的值的异或结果。
当执行第二句s[j] ^= s[i]时,相当于把新的s[i]和原来的s[j]再次异或后赋给s[j]。由于异或运算满足交换律和结合律,所以这相当于把原来的s[i]和原来的s[j]两次异或后赋给了s[j]。根据性质1和2,我们知道这就相当于把原来的s[i]赋给了新的s[j]。此时实现了一半交换。
当执行第三句s[i] ^= s[j];时,相当于把新的sj和新的si再次异或后赋给新的 s[i].由于同样满足交换律和结合律,所以这相当于把原来两者三次异或后赋给了新 的 s [i].根据性质1 和2 ,我们知道这就相当于把原来 的 s [j ] 赋 给 了 新 的 s [i ].此时实现了完全交换。
关于 替换空格
- 本题有同学采用先扩容三倍空间进行替换字符后,再生成一个结果字符串去返回,但是由于是 C++,最后再 char 数组转 string 的过程中出现了错误。C++用 char 数组转 string 一定要记得以 '\0' 结尾,否则就会报错,或者一开始就新建一个 string 而不是 char 数组也不失为一种选择。
关于 翻转字符串里的单词
- 翻转单词这一题为什么会最后输出只有最后一个字母不对?
输出:
"blue is sky eht"
预期结果
"blue is sky the'
最后一个单词判断逻辑跟前面不一样,因为不是空格结尾。所以特殊处理一下就好。或者预先直接在字符串后面加个空格
关于 kmp算法
- “KMP算法 和 day10 安排的题目(kmp的一个应用),一刷 录友们 可以适当放过,或者了解一下 算法原理就行,毕竟比较难,等二刷的时候再重点啃
- 发现很多小伙伴都无法理解kmp, 其实我一开始学的时候也理解不了, 主要是理解好next数组的创建和回退的过程!下标也有很多种写法,大家记住一种自己写的习惯的就好了。
- 考虑到大多数小伙伴理解不了kmp,我自己其实说实话也经常会忘记kmp怎么写,但是能理解他的思想,所以真的不想学kmp的小伙伴我这边给一个字符串哈希算法的模板,也给出了证明,是我很早之前写的一篇博客,大家要是无法理解或者怎么都记不住的话直接背字符串哈希的模板简单理解一下也可以解决力扣上所有kmp的问题了哈 ,在最上面会给出字符串哈希的博客。
- “最长相同前缀”是什么?“最长相同前缀”=“最长相同后缀”?
就是最长相同前后缀中的 前缀和后缀部分。谈及相同 必须得有比较 单纯的说相同前缀不知所云 这两个名字是基于“最长相同前后缀”拆出来的 图里标注是为了明确前缀后缀是哪部分 - "当 needle 是空字符串时,我们应当返回什么值呢? 这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0。这与C语言的 strstr0 以及 Java的 indexof0 定义相符"。 这里为什么要返回 0 呢
这个很有意思 语言的设计哲学吧 认为空字符串是无处不在的 可以将任意字符串str看做是 "" + str。可以看stack overflow上的讨论 Java String.indexOf and empty Strings - Stack Overflow