题目:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串 "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;
}
};