From d208ab55baa7d3f80cd137cf02150e138529c6db Mon Sep 17 00:00:00 2001 From: pezy-pc Date: Mon, 8 Dec 2014 09:40:51 +0800 Subject: [PATCH] added 55. Length of Last Word --- 55. Length of Last Word/README.md | 23 +++++++++++++++++++++++ 55. Length of Last Word/TEST.cc | 10 ++++++++++ 55. Length of Last Word/solution.h | 10 ++++++++++ 55. Length of Last Word/solution_string.h | 14 ++++++++++++++ 4 files changed, 57 insertions(+) create mode 100644 55. Length of Last Word/README.md create mode 100644 55. Length of Last Word/TEST.cc create mode 100644 55. Length of Last Word/solution.h create mode 100644 55. Length of Last Word/solution_string.h diff --git a/55. Length of Last Word/README.md b/55. Length of Last Word/README.md new file mode 100644 index 0000000..1c39fc7 --- /dev/null +++ b/55. Length of Last Word/README.md @@ -0,0 +1,23 @@ +当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 的时候,重新记录。代码很简单: + +```cpp +int len{0}; // 如果没有 word ,自然返回0 +for (int beg = 0; *s, ++s) // 迭代 + if (*s == ' ') beg = 0; // 遇到空格,意味着重新记录 + else len = ++beg; // 不是空格,意味着累计长度 +return len; +``` + +曾经说过,Easy 难度的题,至多五行,即使如此底层的代码依旧如此。我想这是在考验 C 基础。 diff --git a/55. Length of Last Word/TEST.cc b/55. Length of Last Word/TEST.cc new file mode 100644 index 0000000..c23440b --- /dev/null +++ b/55. Length of Last Word/TEST.cc @@ -0,0 +1,10 @@ +#define CATCH_CONFIG_MAIN +#include "../Catch/single_include/catch.hpp" +#include "solution.h" + +TEST_CASE("Length of Last Word", "[lengthOfLastWord]") +{ + Solution s; + REQUIRE( s.lengthOfLastWord("a ") == 1 ); + REQUIRE( s.lengthOfLastWord("Hello World") == 5 ); +} diff --git a/55. Length of Last Word/solution.h b/55. Length of Last Word/solution.h new file mode 100644 index 0000000..554c462 --- /dev/null +++ b/55. Length of Last Word/solution.h @@ -0,0 +1,10 @@ +class Solution { +public: + int lengthOfLastWord(const char *s) { + int len{0}; + for (int beg = 0; *s; ++s) + if (*s == ' ') beg = 0; + else len = ++beg; + return len; + } +}; diff --git a/55. Length of Last Word/solution_string.h b/55. Length of Last Word/solution_string.h new file mode 100644 index 0000000..54586ab --- /dev/null +++ b/55. Length of Last Word/solution_string.h @@ -0,0 +1,14 @@ +#include +using std::string; + +class Solution { +public: + int lengthOfLastWord(const char *s) { + string str(s); + str.erase(str.find_last_not_of(' ')+1); + if (str.empty()) return 0; + auto found = str.find_last_of(' '); + if (found == string::npos) return str.size(); + else return str.size() - found - 1; + } +};