一、58. 最后一个单词的长度
题目介绍:
给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个
单词的长度。
单词
是指仅由字母组成,不包含任何空格字符的最大子字符串。
示例 1:
输入: s = "Hello World Javascript " 输出: 5 解释: 最后一个单词是“Javascript”,长度为10。
示例 2:
输入: s = "How old ayr you " 输出: 6 解释: 去除字符串尾部的空格,最后一个单词是长度为3的“you”。
二、解题分析
问题的重点在于如何找到最后一个单词,整个字符串只有英文字母和空格,那是否可以直接通过split
方法将字符串转为数组,直接取出数组的最后一个元素就是最后一个单词呢?
如果你就这么简单的想,确实是掉进了面试官的坑里。因为字符串有可能在末尾存在1个或多个空格,这样的话,最后一个元素肯定不是最后一个单词,需要在函数内部实现时筛除这种情况。
方案一:split分割字符串,倒序遍历数组
/** * @method lengthOfLastWord1 * @description: 获取字符串最后一个单词长度 - split * @param {string} s * @return {number} */ function lengthOfLastWord1(s: string): number { // 获取字符串长度 const len = s.length; // 边界处理 if (len === 0) { return 0; } // 1. 分割成数组 const arr = s.split(' '); // 定义变量tmpS接收数组中每个元素 let tmpS = ''; // 2. 倒序遍历数组,依次取出每一个元素 do { // 兼容处理,当pop出undefined时的情况 tmpS = arr.pop() ?? ''; // 当tmpS不为空时,说明接收到了最后一个单词 if (tmpS !== '') { // 停止循环即可 break; } } while (arr.length); // 返回最后一个单词长度 return tmpS.length; }
功能测试:
const s1 = 'Hello World Javascript '; const s2 = 'How old ayr you '; console.log(lengthOfLastWord1(s1)); // 10 console.log(lengthOfLastWord1(s2)); // 3
没啥问题!
方案二、倒序遍历字符串,拼接最后一个单词
将字符串倒序遍历,如果开始字符就是空格,就直接跳过,不是则拼接到tmpS
中; 当tmpS
有值之后,再遇到空格,就说明这个单词已经结束了。
/** * @method lengthOfLastWord2 * @description: 获取字符串最后一个单词长度 - 倒序遍历字符串 * @param {string} s * @return {number} */ function lengthOfLastWord2(s: string): number { // 获取字符串长度 const len = s.length; // 临界点处理 if (len === 0) { return 0; } // 接收最后一个单词字符拼接 let tmpS = ''; // 1. 倒序遍历字符串 for (let i = len - 1; i >= 0; i--) { // 判断当前字符是否是空格 // 当是空格的时候判断 - 是否是末尾字符 // + 是末尾空格字符,直接跳过 // + 如果不是末尾空格字符,说明一个单词到结束了 // 末尾倒序,tmpS为空,表示遇到的都是末尾开始的空格字符 if (s[i] === ' ' && tmpS === '') { continue; } // 非空格字符 -> 并且tmpS有值了,说明单词结束了 if (s[i] === ' ' && tmpS) { break; } // 其他字符,直接拼接 tmpS = s[i] + tmpS; } // 返回字符串最后一个单词长度 return tmpS.length; }
功能测试:
const s1 = 'Hello World Javascript '; const s2 = 'How old are you '; console.log(lengthOfLastWord2(s1)); // 10 console.log(lengthOfLastWord2(s2)); // 3
没啥问题!