句子 是一个单词列表,列表中的单词之间用单个空格隔开,且不存在前导或尾随空格。每个单词仅由大小写英文字母组成(不含标点符号)。
例如,“Hello World”、“HELLO” 和 “hello world hello world” 都是句子。
给你一个句子 s 和一个整数 k ,请你将 s 截断 ,使截断后的句子仅含 前 k 个单词。返回 截断 s 后得到的句子。
- 我的题解
char * truncateSentence(char * s, int k){
int i;
int count;
count=0;
i=0;
while(*(s+i)!='\0'){
if(*(s+i)==' '){
count++;
if(count==k){
*(s+i)='\0';
}
}
i++;
}
return s;
}
- 我的小理解
1、说实话,这道题我一眼就出答案,可是在编程的过程中出现了各种错误。直接用计数器count记下空格的数量,i是循环因子。
2、要注意空格的数量并不对应短语的数量,因为空格数量和+1才是我们要的总数。不过由于计算机语言是按照从上到下的顺序编译,我们利用这个特性,就不需要考虑最后一次,因为越界之后自然就停下来了。
3、继续说明为什么自动停下来,因为若遍历到实参字符串的"\0"字符,就表明到结尾了,这个时候我们已遍历完毕所有单词,返回只需要返回原字符串即可。也不用单独加结尾符号,因为我们就是利用传入的字符串做文章,可以减少内存消耗,不过平时不建议这么做,因为实参指针指向内容会发生改变。
刚开始CLion没有报错,但是输出有毛病,我在答案前面输出一句话,又能出现正确的答案了,一旦使用了指针没有好好进行封装就要做好被内存背刺的准备。昨天我随便试了一下,Clion中不能跑出来的,力扣给AC了。我佛了。 - 我的一些怨言
To be honest,就是这道题,让我下定了学C++的决心,因为实在是太难受了,一般情况下传参还好,要是涉及到递归传参和字符串变量传参就会出现各种奇怪的问题。其实不是C语言的错,是我自己的错,一些底层的逻辑我弄不清楚,递归过程又不是完全透明的,因此影响了我的判断。指针还有可能造成内存的访问错误,我今天,把这几个博客收尾,就进入学习C++的节奏。