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

344.反转字符串

思路:双指针法,从两边往中间走,交换两个指针对应的元素

 1 /**
 2  * @param {character[]} s
 3  * @return {void} Do not return anything, modify s in-place instead.
 4  */
 5 var reverseString = function(s) {
 6     let i = 0;
 7     let j = s.length - 1;
 8     let tem = 0;
 9     while (i < j) { //如果有偶数个字符,则刚好两两交换玩,如果有奇数个字符,最后i=j,无需交换
10         tem = s[i];
11         s[i] = s[j];
12         s[j] = tem;
13 
14         i++;
15         j--;
16     }
17     return;
18 };
View Code

注意:链表的地址不是连续存放的;而数组的地址是连续分布的;所以反转字符串要比反转链表简单一些;

541. 反转字符串II

!!!注意 JS中的字符串是不可变的,这意味着你不能直接修改字符串中的字符

需要将其转换为数组!!!

注意这题给的是字符串,而上一题给的是字符数组!!!

 1 const arr = s.split(''); // 将字符串转换为数组 2 return arr.join(''); // 将数组转换回字符串 

 1 /**
 2  * @param {string} s
 3  * @param {number} k
 4  * @return {string}
 5  */
 6 var reverseStr = function(s, k) {
 7     const arr = s.split(''); // 将字符串转换为数组
 8     for (let fast = 0; fast < arr.length - 1; fast += 2 * k) {
 9         if (fast + k <= arr.length - 1) {
10             let tem = 0;
11             let i = fast;
12             let j = fast + k - 1;
13             while (i < j) { //如果有偶数个字符,则刚好两两交换完,如果有奇数个字符,最后i=j,无需交换
14                 tem = s[i];
15                 arr[i] = s[j];
16                 arr[j] = tem;
17                 i++;
18                 j--;
19             }
20         } else {
21             let tem = 0;
22             let i = fast;
23             let j = arr.length - 1;
24             while (i < j) { //如果有偶数个字符,则刚好两两交换完,如果有奇数个字符,最后i=j,无需交换
25                 tem = arr[i];
26                 arr[i] = arr[j];
27                 arr[j] = tem;
28                 i++;
29                 j--;
30             }
31         }
32     }
33     return arr.join(''); // 将数组转换回字符串
34 };
View Code

剑指Offer 05.替换空格

新建一个数组arr2

 1 /**
 2  * @param {string} s
 3  * @return {string}
 4  */
 5 var replaceSpace = function(s) {
 6     const arr = s.split(''); //字符串转为数组
 7     //计算空格的数量,决定扩容空间
 8     let count=0;
 9     for(let i=0;i<arr.length;i++){
10         if(arr[i]===' ') count++;
11     }
12     console.log(count);
13     let arr2 = new Array(s.length+2*count);
14     let j =arr.length-1;
15     console.log(arr.length)
16     console.log(arr2.length)
17     for(let i = arr2.length-1;i>=0;){
18         if(arr[j]==' '){
19             arr2[i--]='0';
20             arr2[i--]='2';
21             arr2[i--]='%';
22             j--;
23         }
24         else{
25             arr2[i] = arr[j];
26             j--;
27             i--;
28         }
29     }
30     console.log(arr2)
31     return arr2.join('');
32 };
View Code

151.翻转字符串里的单词

思路:

  1. 遍历整个数组,空格去重
  2. 对整个数组进行翻转
  3. 对单词进行翻转
 1 /**
 2  * @param {string} s
 3  * @return {string}
 4  */
 5 var reverseWords = function(s) {
 6 
 7     // 转为数组
 8     const arr = s.split('');
 9 
10     // 空格去重
11     let fast = 0;
12     let slow = 0;
13     while (fast < s.length) {
14         // 移除开始位置和重复的空格
15         if (arr[fast] === ' ' && (fast === 0 || arr[fast - 1] === ' ')) {
16             fast++;
17         } else {
18             arr[slow++] = arr[fast++];
19         }
20     }
21     // 移除末尾空格
22     arr.length = arr[slow - 1] === ' ' ? slow - 1 : slow;
23 
24     console.log(slow);
25     console.log(fast);
26     console.log(arr);
27     console.log(arr.length)
28 
29     let left = 0;
30     let right = arr.length - 1;
31 
32     // 整个数组翻转
33     while (left < right) {
34         tem = arr[right];
35         arr[right] = arr[left];
36         arr[left] = tem;
37 
38         // 收缩
39         left++;
40         right--;
41 
42     }
43 
44     console.log(arr);
45     console.log(arr.length)
46 
47     // 单词翻转
48     slow = 0; //指向单词的第一个字符
49     fast = 0; //指向单词的第一个字符
50     while (fast < arr.length) {
51         //遍历元素,直到fast指向单词的最后一个字符
52         while (arr[fast + 1] !== ' ' && fast < arr.length) {
53             fast++;
54         }
55 
56         // 翻转单个单词
57         left = slow;
58         right = fast;
59         while (left < right) {
60             tem = arr[right];
61             arr[right] = arr[left];
62             arr[left] = tem;
63             // 收缩
64             left++;
65             right--;
66         }
67 
68         // slow 和fast指向下一个单词的第一个字符重新开始下一个循环
69         if (fast + 2 < arr.length) {
70             fast += 2;
71             slow = fast;
72         } else break;
73     }
74     return arr.join('')
75 
76 };
View Code

收获

  1. 在 JavaScript 中,字符串和字符数组是两种不同的数据类型
  2. 字符串(String)字符串是 JavaScript 中的基本数据类型之一。它是一个包含零个或多个字符的文本序列,可以使用单引号(')或双引号(")来表示。字符串是不可变的,这意味着一旦创建,就不能直接修改字符串中的字符。字符串在 JavaScript 中有许多内置的方法,可以用于字符串的操作和处理,比如拼接、查找、替换、分割等。
  3. 1 const str = "Hello, world!";
    2 console.log(str.length); // 输出:13
    3 console.log(str.charAt(0)); // 输出:H
    4 console.log(str.slice(0, 5)); // 输出:Hello

     

  4. 字符数组(Character Array)
  5. 在 JavaScript 中,字符数组通常指的是一个存储字符的数组。数组是一种数据结构,可以包含多个元素,每个元素可以是任意类型。在 JavaScript 中,数组的元素不必是相同的数据类型。字符数组通常通过将一系列字符存储在数组的各个索引位置来创建。
  6. 1 const charArray = ['H', 'e', 'l', 'l', 'o'];
    2 console.log(charArray.length); // 输出:5
    3 console.log(charArray[0]); // 输出:H

     

 

posted @ 2023-08-30 22:47  子酱  阅读(9)  评论(0)    收藏  举报