最后一个单词的长度(LintCode)

本文介绍了一种简单高效的方法来确定给定字符串中最后一个单词的长度。通过一次遍历即可完成计算,适用于面试及实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源:LintCode

原题地址:http://www.lintcode.com/zh-cn/problem/length-of-last-word/#

题目:

给定一个字符串, 包含大小写字母、空格' ',请返回其最后一个单词的长度。

如果不存在最后一个单词,请返回 0 。

您在真实的面试中是否遇到过这个题? 
Yes
样例

给定 s = "Hello World",返回 5

注意

一个单词的界定是,由字母组成,但不包含任何的空格。

难度级别:
容易

思路分析:
这个题应该是很简单的吧,原来在别的地方见过,不知道为什么当时写这个题是,感觉思路没有今天这么清晰。。。
我的做法是:
1.一次遍历字符串就可以了
2.设置一个临时变量,记录当前单词的长度;
3.设置一个结果变量,存放最终的结果;
4.关键逻辑是:当遍历到空格时,将临时变量的值赋给结果变量,并且将临时变量置为零;当遍历到非空格时,将临时变量的值加1;
需要注意的是,有可能最后一个单词之后没有空格,所以4中的逻辑并不能将此情况计算在内,因此需要补充一个判断;
在遍历结束之后,若临时变量为零(最后一个单词之后还有一个空格),则不作处理;若临时变量非零,则将临时变量的值赋给结果变量。

实现代码:
class Solution
{
public:
	/**
	* @param s A string
	* @return the length of last word
	*/
	int lengthOfLastWord(string& s)
	{
		int tLen = 0;
		//int maxLen = 0;
		int lastLen = 0;
		for (int i = 0; i < s.size(); i++)
		{
			if (s[i] != ' ')
			{
				tLen++;
				/*if (tLen > maxLen)
				{
					maxLen = tLen;
				}*/
			} else
			{
				lastLen = tLen;
				tLen = 0;
			}
		}
		if (tLen != 0)
		{
			lastLen = tLen;
		}
		return lastLen;
	}
};



代码说明:
在分析中,已经将思路解释的较为清楚了。
需要说明的是,注释掉的部分是我原来审题没注意看错了,我以为要求得是最长单词。。。
<think>嗯,用户想知道怎么用编程语言计算字符串最后一个单词长度。我之前处理过类似的问题,记得Python中有几种方法可以实现。让我仔细想想。 首先,用户的需求是输入一个字符串单词之间用空格分隔,要找出最后一个单词长度。比如输入“hello nowcoder”,输出应该是8,因为最后一个单词是“nowcoder”。 根据引用中的资料,解法一可能用split方法。比如把字符串空格分割成列表,然后取最后一个元素,再计算长度。但要注意处理前后空格的情况,比如字符串末尾可能有多个空格,或者没有空格结尾。这时候可以用strip()函数先去掉前后空格,再分割,这样就不会因为末尾的空格导致最后一个元素是空字符串了。 另外,引用提到解法二用反向遍历字符串,找到第一个空格的位置,然后计算最后一个单词长度。这种方法可能更高效,特别是当字符串很长时,因为不需要分割整个字符串,只需要从后往前找到第一个空格的位置,然后计算长度。这在处理字符串时可能更节省时间内存。 比如,假设字符串是s,从最后一个字符开始,跳过末尾可能的空格,然后从那里开始计数,直到遇到空格或者到达字符串开头为止。这时候计数的次数就是最后一个单词长度。 然后,用户可能想知道具体如何实现这两种方法。我需要给出Python的代码示例,并解释每一步的作用。 比如,对于split方法,代码可以是这样的:先用strip()去掉前后空格,然后用split(' ')分割,取最后一个元素,返回长度。不过要注意,split默认分割多个空格为多个空字符串,但用split()不带参数的话会自动处理多个空格,但用户的情况是明确用空格分隔,所以可能需要明确处理。或者使用split()默认按任意空格分割,这样更安全。 比如,s.strip().split()[-1]的长度。split()不带参数的话,会按任意空白符分割,并且忽略前后的空格,这样可能更可靠,不管中间有多少空格或者末尾有没有空格。比如,输入如果是“ hello world ”,strip之后变成“hello world”,split()按空白分割成['hello', 'world'],所以最后一个元素是world,长度5。 另外,在解法二中,需要反向遍历。可以用一个循环,从最后一个字符开始,跳过末尾的空格,然后开始计数,直到遇到空格或者开头。比如: 初始化length为0,从索引-1开始,循环直到字符不是空格,然后继续循环直到遇到空格或开头,每次length加一。这样得到的length就是最后一个单词长度。 或者,可以用字符串的rfind方法来找最后一个空格的位置。例如,先strip掉末尾空格,然后找到最后一个空格的位置,然后用总长度减去该位置减一。比如,处理后的字符串是s,总长度是n,最后一个空格的位置是i,那么最后一个单词长度是n - i -1。如果没有空格,说明整个字符串就是一个单词长度就是n。 比如,代码可以是: s = s.strip() last_space = s.rfind(' ') if last_space == -1: return len(s) else: return len(s) - last_space -1 这样可能更简洁。 用户可能还会关心边界情况,比如字符串全是空格,或者只有一个单词的情况。这时候需要测试这些情况,确保代码的鲁棒性。 总结下来,两种方法各有优劣。split方法简直接,适用于多数情况,尤其是字符串不太的时候。反向遍历可能在处理字符串时更高效,因为它不需要分割整个字符串。 另外,需要提醒用户注意输入字符串长度是否符合要求,比如是否超过5000字符,这时候需要做检查,如引用中的代码那样。 最后,应该给出示例代码,并解释每种方法的步骤,然后比较它们的优缺点,帮助用户根据实际情况选择合适的方法。</think>### 计算字符串最后一个单词长度的方法 要计算字符串最后一个单词长度,可以通过以下两种常用方法实现: #### 方法一:字符串分割法(简直接) 1. **去前后空格**:使用`strip()`去除字符串首尾的空格,避免末尾空格干扰 2. **分割单词**:按空格分割字符串生成列表 3. **取最后一个元素**:获取列表最后一个元素并计算其长度 **Python实现**: ```python def get_last_word_length(s): s = s.strip() # 去除首尾空格 words = s.split() # 按空格分割(自动处理连续空格) if not words: # 处理空字符串 return 0 return len(words[-1]) ``` #### 方法二:反向遍历法(高效省内存) 1. **去尾部空格**:从字符串末尾向前遍历,跳过所有尾部空格 2. **统计字符**:从第一个空格字符开始计数,直到遇到空格字符串开头 **Python实现**: ```python def get_last_word_length(s): length = 0 i = len(s) - 1 # 跳过末尾的空格 while i >= 0 and s[i] == ' ': i -= 1 # 统计最后一个单词长度 while i >= 0 and s[i] != ' ': length += 1 i -= 1 return length ``` #### 方法对比 | 方法 | 优点 | 缺点 | |----------|-------------------------|---------------------| | 字符串分割法 | 代码简洁,易理解 | 内存占用高(需生成列表) | | 反向遍历法 | 内存高效,时间复杂度低($O(n)$) | 代码逻辑略复杂,需处理边界条件[^3] | --- ### 相关问题 1. 如果字符串中全是空格,这两种方法会返回什么结果? 2. 如何优化反向遍历法以兼容不同编程语言的实现? 3. 在内存受限的场景下,哪种方法更适合处理超长字符串? 引用[^1]: 输入字符串末尾不以空格为结尾,但需处理用户可能的输入错误。 引用[^2]: 使用`split()`时默认处理连续空格,避免生成空字符串元素。 引用[^3]: 反向遍历法通过索引直接操作字符串,减少额外内存消耗。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值