开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情
前言
本系列文章主要会总结一些常见的算法题目以及算法的易错点,难点,以及一些万用的公式,并且结合实际的 Leetcode 题目来进行加深理解以及实际应用,算法这种东西,属于是一到用时方恨少的类型,在平时总结一些常见的简单算法,经常磨练自己的算法思维,对于日常的开发还是能有不少的帮助的。
- 今天还是来看一下字符串相关的知识,以及 leetcode题 344. 反转字符串
字符串的特点
- 首先 JS 中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变 某个变量保存的字符串,首先要销毁原来的字符串,然后再用另一个包含新值的字符串填充该变量。
以上示例中的变量 str 分别是由 'a' 改为 'ab' 这其中的过程并不是对原有字符串的修改,而是建立了一个新的字符串,然后新字符串是两个字符的组合,当然这个过程是在后台进行的,这也就是为什么字符串拼接会比较消耗性能,一般对于字符串的修改都是先转化为数组,修改完成以后在换回字符串。
-
有length属性 (length 表示字符串的长度)
-
可以通过下标取值(注意 字符串不能通过下标赋值) 下标的最大值 = length-1
-
可以循环遍历 (for, for..in, for...of)
上面三个特点可能感觉和 JS 的数组特别的像,因为 JS 的字符串也属于一个可迭代对象
相比较于数组和字符串的区别,就是在于数组是可以进行修改的,而字符串没有办法,就如第一点说的。
比较典型的就是 Leetcode 344. 反转字符串,数组当中存在反转方法 reverse() 以及一大堆修改数组的方法,但是在字符串上并不存在。
下面就来介绍一下这道题。
Leetcode 344. 反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
解题
这道题输入为数组,输出也为数组,所以我们可以直接对数据进行修改,就像上面说的,通过字符串 reverse() 方法就可以很简单的解决。
function reverseString(s: string[]): void {
s.reverse()
};
至于这个方法的实现逻辑,那也是比较简单的,我们可以通过定义一个中间变量来保存,通过
t=a
b=a
a=t
这种经典的交换方法来交换数组的每一项。
/**
Do not return anything, modify s in-place instead.
*/
function reverseString(s: string[]): void {
let length: number = s.length;
let left: number = 0;
let right: number = length - 1;
let tempStr: string;
while (left < right) {
tempStr = s[left];
s[left] = s[right];
s[right] = tempStr;
left++;
right--;
}
};