输入字符串 "I am a student",则输出 "student.a am I " 。

本文介绍了一种算法,用于翻转英文句子中单词的顺序,同时保持单词内部字符顺序不变。通过整体翻转字符串,然后逐个翻转单词实现目标。提供了详细的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串 "I am a student",则输出 "student.a am I " 。

思路:

首先翻转整个字符串。产生的结果就是“.tneduts a ma i”。

翻转每一个单词。产生结果为“student. a am i”。

代码:

#include "string.h"
#include <string.h>

//二维数组
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char a[4][10] = {"i" ,  "am" ,  "a" , "student" };
//	for (int i = 3; i>=0; i--)
//	{
//		printf("%s ", a[i]);
//	}
//	system("pause");
//	return 0;
//}

//指针数组
//#include<stdio.h>
//#include<string.h>
//int main()
//{
//	char *str[] = { "i", "am", "a", "student" };
//	int len=strlen(str);
//	while (len >=0)
//	{
//		printf("%s ", *(str +(len--)));
//	}
//	system("pause");
//	return 0;
//}

#if 0
void reserve(char arr[], int start, int end)
{
	while (start < end)
	{
		char tmp = arr[start];
		arr[start] = arr[end];
		arr[end] = tmp;
		start++;
		end--;
	}
	return;
}
void reserve_str(char str[], int len)
{
	int i = 0;
	int start = 0;
	int end = 0;
	reserve(str, 0, len - 1);  //整体反转
	while (i <= len)
	{
		if (SPACE==str[end] || END==str[end])
		{
			reserve(str, start, end - 1);//反转每个单词,[start, end - 1]
			start = ++end;              //下一个单词
		}
		else
		{
			end++;
		}
		i++;
	}
	return;
}
#endif



void reverse(char *Left, char *Right)
{
	if (Left != 0 || Right != 0){
		while (Left < Right)
		{
			char Tmp = *Left;
			*Left = *Right;
			*Right = Tmp;
			++Left;
			--Right;
		}
	}
	return;
}

void reserve_str(char str[], int len)
{
	if (SPACE == *str)
		return;
	reverse(str, str + len - 1);//整体逆置

	char *pCur = str;
	while (END!=*str)
	{
		if (SPACE == *str || END == *str)
		{
			reverse(pCur, str - 1);//单词逆置
			pCur = ++str;                   
		}
		else
		{
			str++;
		}
	}
	return;
}



#ifndef STRING_H
#define STRING_H
#include <stdio.h>
#include<stdlib.h>
#include<string.h>

#define NUM 100
#define SPACE ' '
#define END '\0'

void reserve_str(char str[], int len);


#endif
#include"string.h"
#include<windows.h>
#include <string.h>
int main()
{
	char str[NUM] = "i am a student";
	printf("Enter a string:%s\n", str);
	reserve_str(str, strlen(str));
	printf("Reverse a string:%s\n", str);

	system("pause");
	return 0;
}

 

OJ代码:

class Solution {
public:
    //交换位置
    void reverse(string &str,int begin,int end){
        while(begin<end){
            char tmp=str[begin];
            str[begin]=str[end];
            str[end] = tmp;
            begin++;
            end--;
        }
     }
    string ReverseSentence(string str) {
        int len=str.length();
        //整体翻转
        reverse(str,0,len-1);
        int i=0;
        int begin=0;//定义一个开始位置
        int end=0;//定义一个单词的结束位置
          
        while(i<len){
             //把前面的空格都去掉
            while(i < len && str[i] == ' ')
            {
                i++;
            }    
              begin=end=i;
            while(i<len&&str[i]!=' '){
                i++;
                end++;
            } 
            //单词翻转
            reverse(str,begin,end-1);
        }
        return str;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值