T1124 单词翻转(c++实现)

该博客介绍了如何使用C++解决将句子中每个单词翻转的问题,强调了解题的关键在于处理空格的数量和位置。通过创建整型数组存储非空格字符位置,并利用特定条件界定单词边界,实现翻转。博客提供了详细的解题思路和源程序。

问题描述:

输入一个句子(一行),将句子中的每一个单词翻转后输出。

输入

只有一行,为一个字符串,不超过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;
        }
    }
   
    
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值