java判断字符串最后一个字符为字母的方法 判断string最后一个字符_迭代


题目

给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。示例:输入: "Hello World"输出: 5

解题代码与测试

Created by tannzh on 2020/7/17.///* * 最后一个单词的长度 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。示例:输入: "Hello World"输出: 5 */#include #include using std::string;class Solution {public:    int lengthOfLastWord(string s) {        if (s.empty()) return 0;        s.erase(s.find_last_not_of(' ')+1);        auto found = s.find_last_of(' ');        if (found == string::npos) return s.size();        else return s.size() - found - 1;    }};int main(int argc, char **argv){    std::string str = "Hello World";    Solution s;    std::cout << "len = " << s.lengthOfLastWord(str) << std::endl;    return 0;}

解题思路分析

当C++已经发展到11之际,各种处理字符串已经成了日常生活的一部分,遇到一道这样题,难免会感慨,擦,也太简单。

但要说三点:

  1. 如何理解 "If the last word does not exist, return 0.", 测试用例: "a ", 应该返回多少? 答案是1,因为即使最后一位是 ' ' ,但只要有 word 存在,那么 last word 就存在。
  2. 用 std::string 或 std::stringstream 可不可以?我觉得没啥问题,有轮子不用什么意思?一个 `find_last_of(' ')``, 解决很多事。如果面试,可以跟面试官开玩笑的说,看他反应,如果他说不是考察你这个,那你老老实实用C的方法;如果笔试遇到,想都别想用这种偷懒的方式。
  3. 我说用 C的方式,并不意味着用什么 strlen 之类的库函数,那还不如用上面的c++库,效率不一定差。

所以,最高效的方式一定要了解。完整的一次迭代逃不掉的,联系上述三点,你想想一个 string::size() 或 strlen就已经耗尽一次迭代了。。

如何在这次迭代里就找到最后一个 word 的长度,很直接的办法就是一直记录每一个 word 的长度,再遇到新 word 的时候,重新记录。代码很简单:

int len{0}; // 如果没有 word ,自然返回0for (int beg = 0; *s, ++s) // 迭代    if (*s == ' ') beg = 0; // 遇到空格,意味着重新记录    else len = ++beg; // 不是空格,意味着累计长度return len;

曾经说过,Easy 难度的题,至多五行,即使如此底层的代码依旧如此。我想这是在考验 C 基础。