字符串逆序问题

Posted 一朵花花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串逆序问题相关的知识,希望对你有一定的参考价值。

题目1

将一句话的单词进行倒置,标点不倒置。
比如 I like beijing. 经过函数后变为:beijing. like I

输入描述:
每个测试输入包含1个测试用例: I like beijing. 输入用例长度不超过100
输出描述:
依次输出倒置之后的字符串,以空格分割

输出示例:

输入:I like beijing.
输出:beijing. like I

思路:

1.整体进行逆序 I like beijing. → .gnijieb ekil I
2.再对每一个单词进行逆序.gnijieb ekil → Ibeijing. like I

代码实现:

1.整体逆序

1整体逆序
void reverse(char* str,int length) {
	char* left = str;
	char* right = str + length - 1;
	while (left < right) {
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}

2.针对每个单词再逆序
通过start指针来遍历字符串,只要知道单词的起始位置和结束位置,便可调用逆序函数来针对这个单词进行逆序

//2.针对每个单词再逆序
void reverseWord(char* input) {
	reverse(input, strlen(input));
	char* start = input;
	while (*start != '\\0') {
		char* end = start;
		while (*end != ' ' && *end != '\\0') {
			end++;
		}
		reverse(start, end - start);
		if (*end == '\\0') {
			break;//end指向结尾
		}
		else {
			start = end + 1;//end指向空格
		}
	}
}

外层while循环控制反复遍历字符串来控制里层循环来寻找完整的单词来进行逆置,里层while循环即找到一个完整的单词。

在这里插入图片描述
完整代码:

void reverse(char* str,int length) {
	char* left = str;
	char* right = str + length - 1;
	while (left < right) {
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
void reverseWord(char* input) {
	reverse(input, strlen(input));
	char* start = input;
	while (*start != '\\0') {
		char* end = start;
		while (*end != ' ' && *end != '\\0') {
			end++;
		}
		reverse(start, end - start);
		if (*end == '\\0') {
			break;//end指向结尾
		}
		else {
			start = end + 1;//end指向空格
		}
	}
}
int main() {
	while(1){
		char input[1024] = { 0 };
		char* ret = gets(input);//gets一次读一行
		if (ret == NULL) {
			break;
		}
		reverseWord(input);
		printf("%s\\n", input);
	}
	system("pause");
	return 0;
}

注意,主函数种读取字符串不能用scanf,因为scanf读取字符串,遇到空格就结束了,故直接用gets直接一次读取一行,gets的返回值是一个char*类型

题目2

编写一个函数实现:将参数字符串中的字符反向排列,不是逆序打印
例如:abcdef → fedcba

方法一
非递归实现
参考上述reverse逆序函数

方法二
递归实现

//递归实现
void reverse(char* string){
	if (*(string) != '\\0'){
		reverse(string+1);
        printf("%c", *string);
	}
}
int main(){
	char arr[] = "abcdef";
	reverse(arr);
	printf("\\n");
	system("pause");
	return 0;
}

代码过程分析
此处只画了前三次和后三次的递归实现过程
在这里插入图片描述

以上是关于字符串逆序问题的主要内容,如果未能解决你的问题,请参考以下文章

华为机试题 HJ106字符逆序

华为机试题 HJ106字符逆序

字符串内子字符串的逆序算法

Java面试手册-算法篇给定一个字符串,输出逆序字符串

蓝桥杯每日一练—字符逆序

文本项目系列[1]——逆序字符串