问题描述:
输入一个句子(一行),将句子中的每一个单词翻转后输出。
输入
只有一行,为一个字符串,不超过500个字符。单词之间以空格隔开。
输出
翻转每一个单词后的字符串,单词之间的空格需与原文一致。
样例输入
hello world
样例输出
olleh dlrow
本题坑点:
在于空格数和空格位置,两个单词间可能存在不止一个空格,且句首句末皆可能存在空格(句末空格可以忽略)
解题思路:
创建一个整形数组b用于存储非空格字符位置,利用如果出现若干空格,则空格相邻左右两个单词,前面单词的末字母与后面单词的首字母位置之差必然大于1这个条件来界定单词位置
设置两个变量flag_1与flag_2用于暂时记录每个单词首尾字母的位置

定义逆向输出函数
int rolling_over(string c, int a, int b)
{
for(int n = b; n>=a; n--){
cout << c[n];
}
}
数组b用于存储非空格字母的位置
for(int i = 0; i<Length; i++) {
if(a[i] != ' ') b[m++] = i;
b[m] = '\0';
}
先寻找第一个单词,尾字母地址记为flag_1
又分两种情况 字符串以单词起始 字符串以空格起始 分别讨论
两单词首尾字母之间差值为输出空格‘ ’的个数
for(int i = 0; i < m; i++) {
if(b[i]!=b[i+1]-1)
{
if(b[0]!=0)
{
for(int j=0;j<b[0];j++)
cout<<' ';
flag_1 = i;
rolling_over(a,b[0],b[flag_1]);
flag = flag_1;
break;
}
else{
flag_1 = i;
rolling_over(a,0,b[flag_1]);
flag = flag_1;
break;
}
}
}
找到第一个单词之后便有了下一个单词首字母地址为b[flag_1+1],尾字母地址为b[flag_2]
一个单词输出结束后flag_1 = flag_2
for(int i = flag+1; i < m; i++) {
if(b[i] != b[i+1] - 1 || i==m-1)
{
for(int j=0;j<b[flag_1+1]-b[flag_1]-1;j++)
cout<<' ';
flag_2 = i;
rolling_over(a,b[flag_1+1],b[flag_2]);
flag_1 = flag_2;
}
}
源程序
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
//逆向输出函数
int rolling_over(string c, int a, int b)
{
for(int n = b; n>=a; n--){
cout << c[n];
}
}
int main () {
string a;
getline(cin,a);
int Length = a.length();
int i = 0, j, m = 0;
int b[501];
int flag_1 , flag_2 ,flag;
//数组b用于存储非空格字母的位置
for(int i = 0; i<Length; i++) {
if(a[i] != ' ') b[m++] = i;
b[m] = '\0';
}
//先寻找第一个单词,尾字母地址记为flag_1
//又分两种情况 字符串以单词起始 字符串以空格起始 分别讨论
//两单词首尾字母之间差值为输出空格‘ ’个数
for(int i = 0; i < m; i++) {
if(b[i]!=b[i+1]-1)
{
if(b[0]!=0)
{
for(int j=0;j<b[0];j++)
cout<<' ';
flag_1 = i;
rolling_over(a,b[0],b[flag_1]);
flag = flag_1;
break;
}
else{
flag_1 = i;
rolling_over(a,0,b[flag_1]);
flag = flag_1;
break;
}
}
}
//找到第一个单词之后便有了下一个单词首字母地址为b[flag_1+1],尾字母地址为b[flag_2]
//一个单词输出结束后flag_1 = flag_2
for(int i = flag+1; i < m; i++) {
if(b[i] != b[i+1] - 1 || i==m-1)
{
for(int j=0;j<b[flag_1+1]-b[flag_1]-1;j++)
cout<<' ';
flag_2 = i;
rolling_over(a,b[flag_1+1],b[flag_2]);
flag_1 = flag_2;
}
}
}
该博客介绍了如何使用C++解决将句子中每个单词翻转的问题,强调了解题的关键在于处理空格的数量和位置。通过创建整型数组存储非空格字符位置,并利用特定条件界定单词边界,实现翻转。博客提供了详细的解题思路和源程序。
1712

被折叠的 条评论
为什么被折叠?



