最后一个单词的长度

*************

C++

题目:58. 最后一个单词的长度 - 力扣(LeetCode)

*************

简单的看一下题目:

今天的这个题目比较的简单,感觉比前几天的动态规划要简单点。第一眼看到题目的时候,只知道只要求最后一个的长度,我直接从最后开始数,就能解决。

因此,起手就是一个简单的容器用于存放单词的长度,还有就是我得让计算机知道从最后一个单词开始遍历。

class Solution {
public:
    int lengthOfLastWord(string s) {
        int length = 0; // to record the length of the last word
        int tail = s.length() - 1; // tail start from the end of the string

        
    }
};

怎么判断最后一个单词呢?接下来请出我的老伙计,矩阵,为了便于我理解,矩阵无处不在。

shi,ya
指针01234

指针从4 -> 0遍历,当指针遇到‘ ’,这就代表最后一个单词结束。因此主体函数也可以写出来:

从最后一个字母开始

指针向前移动

如果没有遇到‘,’,那么就记录的长度 +1

指针继续向前移动

遇到‘,’,break

循环结束

class Solution {
public:
    int lengthOfLastWord(string s) {
        int length = 0; // to record the length of the last word
        int tail = s.length() - 1; // tail start from the end of the string

        while (tail >= 0 && s[tail] != ' '){
            length++;
            tail--;
        }

        return length;

    }
};

这段代码写下来,看着很简单,但是,运行不正确,shift。

原因是,字符串的最后还是有空格的。代码运行看到空格,就直接结束了。这个是不对的。因此需要在最开始的时候要跳过空格。

class Solution {
public:
    int lengthOfLastWord(string s) {
        int length = 0; // to record the length of the last word
        int tail = s.length() - 1; // tail start from the end of the string

        // skip the space in the last
        while (tail >= 0 && s[tail] == ' '){
            tail--;
        }

        // then start to count the length of the last word
        while (tail >= 0 && s[tail] != ' '){
            length++;
            tail--;
        }

        return length;

    }
};

这里有一个新的知识点:


S && M 代表要同时满足 SM;

S || M 代表满足 S 或者 M;

U != SM 代表如果U是SM,条件为真;

U == SM 代表U是SM;

U = SM 代表U现在是SM了。

OK,周四了,明天又是周五了。

有一串很牛逼的代码:

#include wallet

creazy Thu V 50 for KFC

<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]: 反向遍历法通过索引直接操作字符串,减少额外内存消耗。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值