1816.截断句子

句子 是一个单词列表,列表中的单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。

例如,"Hello World"、"HELLO" 和 "hello world hello world" 都是句子。
给你一个句子 s​​​​​​ 和一个整数 k​​​​​​ ,请你将 s​​ 截断 ​,​​​使截断后的句子仅含 前 k​​​​​​ 个单词。返回 截断 s​​​​​​ 后得到的句子。

class Solution {
public:
    string truncateSentence(string s, int k) {
    char* str1 = (char*)s.data();//string->char

    char* result = strtok(str1, " ");//第一次分割
    string output = result;//输出
    for (int i = 1; i < k; i++) {
        result = strtok(NULL, " ");//第二次分割
        output = output+" "+result;//输出叠加
    }
    return output;
    }
};
执行用时:4 ms, 在所有 C++ 提交中击败了37.72%的用户
内存消耗:7.6 MB, 在所有 C++ 提交中击败了5.26%的用户
通过测试用例:72 / 72
 
标准答案
class Solution {
public:
    string truncateSentence(string s, int k) {
        int n = s.size();
        int end = 0, count = 0;
        for (int i = 1; i <= n; i++) {//这里i比s[i]多1,i是从1计算
            if (i == n || s[i] == ' ') {//这里是遍历到最后或者i下一个是空格就count++(因为最后一个字符后面没有空格)
                count++;
                if (count == k) {
                    end = i;
                    break;
                }
            }
        }
        return s.substr(0, end);
        //substr(a,b) 返回从第a个位置长度为b的字串
        //substr(a) 返回位置a后面的所有剩余字符串(不包括a)
    }
};
int main(){
    string s = "Hello every body I am back here";
    Solution sol;
    string s1=sol.truncateSentence(s, 5);
    cout << s1;
    system("pause");
    return 0;
}

 

 

 
 
posted on 2021-12-06 12:45  托马斯源  阅读(25)  评论(0编辑  收藏  举报