代码随想录算法训练营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 };
注意:链表的地址不是连续存放的;而数组的地址是连续分布的;所以反转字符串要比反转链表简单一些;
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 };
剑指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 };
151.翻转字符串里的单词
思路:
- 遍历整个数组,空格去重
- 对整个数组进行翻转
- 对单词进行翻转
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 };
收获
- 在 JavaScript 中,字符串和字符数组是两种不同的数据类型
- 字符串(String):字符串是 JavaScript 中的基本数据类型之一。它是一个包含零个或多个字符的文本序列,可以使用单引号(')或双引号(")来表示。字符串是不可变的,这意味着一旦创建,就不能直接修改字符串中的字符。字符串在 JavaScript 中有许多内置的方法,可以用于字符串的操作和处理,比如拼接、查找、替换、分割等。
-
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
- 字符数组(Character Array):
- 在 JavaScript 中,字符数组通常指的是一个存储字符的数组。数组是一种数据结构,可以包含多个元素,每个元素可以是任意类型。在 JavaScript 中,数组的元素不必是相同的数据类型。字符数组通常通过将一系列字符存储在数组的各个索引位置来创建。
-
1 const charArray = ['H', 'e', 'l', 'l', 'o']; 2 console.log(charArray.length); // 输出:5 3 console.log(charArray[0]); // 输出:H

浙公网安备 33010602011771号