双指针算法(一)
切分字符
字符串s
是带空格的字符串,s
中有若干单词均由空格隔开。请将s
中的单词分行输出。
输入:一个字符串s(strlen(s)≤1000)
.
输出:按行分开的单词
输入样例
apple banana orange
输出样例
apple
banana
orange
题解
这个题运用的算法是双指针算法:
这里虽然是名字叫指针,但实际上如果真的用指针会非常麻烦,所以我们都是用变量的值模拟指针指向哪里,比如
i=2
,就表示i
指向下标为2
的位置
初始时,我们让i
指向字符串的开头(即i=0
),并且让j=i
。
i
↓
apple banana orange
↑
j
接着移动j
指针,当s[j]
不是字符串末尾且s[j]
不是空格时,将j
指针往后移动。
i
↓
apple banana orange
↑
j
当j
指向空格或者到达末尾时,此次的j不再向后移动,此时i~j
之间的字符构成一个完整的单词,将其输出即可。
i
↓
apple banana orange
↑
j
此次循环的最后让i=j
i
↓
apple banana orange
↑
j
进入下一次循环的时候i++
,开始寻找下一个完整的单词。
i
↓
apple banana orange
↑
j
代码
//C语言版本
#include <stdio.h>
int main(void)
{
char s[1000];
gets(s); //gets(s)可以实现字符串的带空格输入
for(int i=0; s[i]; ++i)
{
int j=i;
while(s[j] && s[j]!=' ') j++;
//这里的s[j]是s[j]!='/0'(字符串自带的结束符‘/0’的ASCLL码为0)
for(int k=i; k<j; ++k) printf("%c", s[k]);
printf("\n");
i=j;
}
return 0;
}
//C++版本
#include <iostream>
#include <string.h>
using namespace std;
int main(void)
{
char s[1000];
gets(s);
int n=strlen(s);
for(int i=0; i<n; i++)
{
int j=i;
while(j<n && s[j]!=' ') j++;
for(int k=i; k<j; ++k) cout<<s[k];
cout<<endl;
i=j;
}
return 0;
}