while 循环的写法,我觉得自己一直写的举步维艰。拿一些简单的例子,我们刻意强化下这块吧。
151. 颠倒字符串中的单词
操作思路:
遍历字符串,遇到空字符串,就把之前积累的字符成word,存入响应数据结构里,然后周而复始
var reverseWords = function(s) {s = s.trim();s += ' '; // 构造更规律的结构let n = s.length;let queue = [];let pre = '';let i = 0;while (i < n) { // 因为单词之间可能有多个连续空格,所以使用 for 循环会比较不好理解if (s[i] !== ' ') {pre += s[i];} else {if (pre) { // pre 的判断是题眼!!!queue.unshift(pre);pre = '';}}i++;}return queue.join(' ');};
58. 最后一个单词的长度
var lengthOfLastWord = function(s) {s = ' ' + s + ' ';let ans = [];let pre = '';for (let char of s) {if (char === ' ') {if (pre) {ans.push(pre);pre = '';}continue;} else {pre = pre + char;}}return ans[ans.length - 1].length;};
8. 字符串转换整数 (atoi)
累加整数成和
var myAtoi = function(s) {s = s.trim();let fristLetter = s[0];let sign = 1; // 默认正号if (fristLetter === '-') {sign = -1;s = s.slice(1);} else if (fristLetter === '+') {s = s.slice(1);}let limit = Math.pow(2,31);let n = s.length;let num = 0;let i = 0;while (i < n) {let cur = s[i];if (cur < '0' || cur > '9') { // 不是数字break;}num = num * 10 + Number(cur) * sign; //// if (num === Infinity) { // 不符合题目要求// return Infinity;// }if (num >= limit - 1) { // 题目要求整数数超过 32 位有符号整数范围 [−231, 231 − 1]return limit - 1;} else if (num < -limit) {return -limit}i++;}return num;};
剑指 Offer 05. 替换空格
从尾部开始替换。
var replaceSpace = function(s) {let n = s.length;let i = n - 1;while (i >= 0) {if (s[i] === ' ') {s = s.slice(0, i) + '%20' + s.slice(i + 1)}i--;}return s;};
二、while 和 for 结合的写法:
1.树的层序遍历
2.不断过滤一个集合,直到集合为空
127. 单词接龙
var ladderLength = function(beginWord, endWord, wordList) {if (wordList.length === 0 || !wordList.includes(endWord)) {return 0;}const wordDict = new Set(wordList); // set 查找速度比 array 快的多const queue = [beginWord]; // 1. 全局 queue 声明while (queue.length > 0) {let size = queue.length;for (let i = 0; i < size; i++) {let curWord = queue.shift();const result = didMatch(curWord, endWord);if (result) {return true;}}}function didMatch(curWord, targetWord) { // curWord 和 targetWord 长度相同for (let i = 0; i < curWord.length; i++) { // 每个字符都要替换比较for (let c = 97; c < 123; c++) {let changedChar = String.fromCharCode(c);let changedWord = curWord.slice(0, i) + changedChar + curWord.slice(i + 1);if (changedWord === targetWord) {return true;}if (wordDict.has(changedWord)) {queue.push(changedWord); // 1. 全局 queue 加入wordDict.delete(changedWord); // 匹配过的就删了}}}return false;}return true;};
