一.字符串逆序
问题描述:
输入一个字符串str,将其内容颠倒过来,并输出。
数据范围0<len(str)<10000
输入描述:
输入一个字符串,可以有空格
输出描述:
输出逆序的字符串
输入样例:
I am a student
输出样例:
tneduts a ma I
方法一:创建一个新的数组用来存储原数组内的字符串(反向存储),将新的数组输出
利用循环的方式将原字符串数组中的元素反向存储在新创建的字符串数组中,之后输出新的字符串数组。
代码如下:
#include <stdio.h>
#include <string.h>
int main()
{
char str[10000];//由于题目中要求的长度范围为0~10000,因此创建了长度为10000的数组
char str2[10000];
int i;
gets(str);
int size = strlen(str);
for (i = 0; i < size; i++)
str2[i] = str[size - i - 1];//利用新创建的数组来反向存储原数组中的数据
str2[i] = 0;//确保输出结果的正确性
puts(str);
return 0;
}
得到输出结果为
方法二:利用指针对字符串数组进行逆置,逆置后输出
1.定义char类型指针left,用来指向字符串数组的首元素;
2.定义char类型指针right,用来指向字符串的最后一个元素;
3.循环进行首元素和尾元素的交换,之后left右移,right左移,直至left等于right时,循环结束,字符串完成逆置。
代码如下:
void Reverse(char* str)
{
char* left = str;//left指向字符串数组的首元素
char* right = str + strlen(str)-1;//right指向字符串的最后一个元素
while(left < right)//进行首元素和尾元素的交换,直至left等于right为止,此时字符串完成1逆置
{
char temp = *left;
*left = *right;
*right = temp;
++left;
--right;
}
}
int main()
{
char str[10000];
gets(str);
Reverse(str);
puts(str);
return 0;
}
二.倒置字符串(字符串逆序问题的升级)
题目描述(题目来源:牛客网):
将一句话的单词进行倒置,标点不倒置。比如 I like beijing. 经过函数后变为:beijing. like I
输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割
输入样例:
I like beijing.输出样例:
beijing. like I
解题思路:
1.首先将整个字符串逆置;
2.之后将每个单词逆置(最后一个单词结尾非空格);
3.逆置时不要逆置‘\0’
首先创建逆置函数,原理如上述以指针进行逆置的方式,代码如下:
void Reverse(char* left, char* right)
{
while (left < right)
{
char temp = *left;
*left = *right;
*right = temp;
++left;
--right;
}
}
根据逆置函数首先对整个字符串进行逆置
Reverse(str,str+strlen(str)-1);
之后依次遍历字符串,依次对每个单词进行逆置
char* left = str;
char* right = str;
while (*left != '\0')
{
while (*right != ' ' && *right != '\0')
right++;
if (*right == ' ')
{
Reverse(left, right - 1);
right++;
left = right;
}
else
{
Reverse(left, right - 1);
left = right;
}
}
源码如下:
#include <stdio.h>
#include <string.h>
void Reverse(char* left, char* right)
{
while (left < right)
{
char temp = *left;
*left = *right;
*right = temp;
++left;
--right;
}
}
int main()
{
char str[100];
gets(str);
//首先进行整体逆置
Reverse(str,str+strlen(str)-1);
char* left = str;
char* right = str;
while (*left != '\0')
{
while (*right != ' ' && *right != '\0')
right++;
if (*right == ' ')
{
Reverse(left, right - 1);
right++;
left = right;
}
else
{
Reverse(left, right - 1);
left = right;
}
}
printf("%s\n", str);
return 0;
}
运行结果如下: