子字符串反向问题——不循环 不开数组

loveumozart 2017-12-07 11:42:43
请编写一个递归函数 reverse(char str[], int start, int end ) ,该函数的功能是将串 str 中下标从 start 开始到 end 结束的字符颠倒顺序。假设 start 和 end 都在合理的取值范围。

例如:

执行前:str[]="0123456";start=1 ;end=4

执行后:strr[]="0432156"

要求在该函数中不使用新的数组,没有循环。

注意:只需要编写递归函数 reverse,系统中已经设置好了main函数。
#include <stdio.h>

#include <stdlib.h>

void reverse( );

int main( )

{ char str[100];

int start, end;

gets(str);

scanf("%d%d", &start, &end);

reverse( str, start, end );

printf("%s\n", str);

return 0;

}

上面为前置代码,
测试用例 1
0123456
1 4
结果:
0432156

测试用例 6
0123456
6 10
结果:
0123456

测试用例 7
0123456
0 10
结果:
6543210


想了好久.....不知道该如何实现不用循环和数组的方式实现反向输出...
不知道为什么前面一个帖子404进不去了...是因为大家觉得这个问题太白痴了吗...
其实上个帖子大家说的都对但都不对,这道题确实是用递归来做, 可是大家要知道如果用start+1,end-1的话,看看测试用例7,按大家所说的输出结果并不是6543210,因为main函数中str数组开了100个格子,gets(str)之后,剩下没有被get到字符的格子里也存储了数据。结果上个帖子大家都在骂我...骂完还不让我回复大家了...我只有重新开个帖子了...
...全文
277 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
真相重于对错 2017-12-07
  • 打赏
  • 举报
回复
void reverse(char* str,unsigned int start,unsigned int end)
{
	if(start>strlen(str))
		return;
	if(end>strlen(str))
		end=strlen(str)-1;
	if(start<end)
	{
		char tmp = str[start];
		str[start]=str[end];
		str[end]=tmp;
	}
	else
		return;
	reverse(str,++start,--end);
}
loveumozart 2017-12-07
  • 打赏
  • 举报
回复
loveumozart 2017-12-07
  • 打赏
  • 举报
回复
学校布置的练习题作业... 我写的是: void reverse(char str[], int start, int end ) { if(start >= end) ; else { if(str[end]== '\0') reverse(str, start, end-1); else if(str[start + 1]=='\0') ; else { char change; change = str[start]; str[start] = str[end]; str[end] = change; reverse(str, start + 1, end - 1); } } } online judge判断wrong answer
loveumozart 2017-12-07
  • 打赏
  • 举报
回复
引用 13 楼 wodexiaojidan 的回复:
#include <stdio.h>

int SimpleStrlen(char str[])
{
	if(str == NULL){
		return -1;
	}
	
	char *end = str;
	for(; *end != 0; ++end);
	
	return (end - str);
}

void reverse(char str[], int start, int end)
{
	if(str == NULL || start < 0 || end < 0){
		return;
	}

	if(start >= end){
		return;
	}else{
		int l = SimpleStrlen(str);
		
		if(start >= l - 1){
			return;
		}else if(end >= l){
			reverse(str, start, l - 1);
		}else{
			int tmp = str[start];
			str[start] = str[end];
			str[end] = tmp;

			reverse(str, start + 1, end - 1);
		}
	}
}

int main(void)
{
	char str[100];  
    int start, end;  
	
    gets(str);  
    scanf("%d%d", &start, &end);  

    reverse( str, start, end );  

    printf("%s\n", str);  

    return 0;  
}
0123456 1 4 0432156 0123456 6 10 0123456 0123456 0 10 6543210
谢谢!恐怕只有像这样再写一个子函数来完成了.....
wodexiaojidan 2017-12-07
  • 打赏
  • 举报
回复
#include <stdio.h>

int SimpleStrlen(char str[])
{
	if(str == NULL){
		return -1;
	}
	
	char *end = str;
	for(; *end != 0; ++end);
	
	return (end - str);
}

void reverse(char str[], int start, int end)
{
	if(str == NULL || start < 0 || end < 0){
		return;
	}

	if(start >= end){
		return;
	}else{
		int l = SimpleStrlen(str);
		
		if(start >= l - 1){
			return;
		}else if(end >= l){
			reverse(str, start, l - 1);
		}else{
			int tmp = str[start];
			str[start] = str[end];
			str[end] = tmp;

			reverse(str, start + 1, end - 1);
		}
	}
}

int main(void)
{
	char str[100];  
    int start, end;  
	
    gets(str);  
    scanf("%d%d", &start, &end);  

    reverse( str, start, end );  

    printf("%s\n", str);  

    return 0;  
}
0123456 1 4 0432156 0123456 6 10 0123456 0123456 0 10 6543210
wodexiaojidan 2017-12-07
  • 打赏
  • 举报
回复
#include <stdio.h>

int SimpleStrlen(char str[])
{
	if(str == NULL){
		return -1;
	}
	
	char *end = str;
	for(; *end != 0; ++end);
	
	return (end - str);
}

void reverse(char str[], int start, int end)
{
	if(str == NULL || start < 0 || end < 0){
		return;
	}

	if(start >= end){
		return;
	}else{
		int l = SimpleStrlen(str);
		
		if(start >= l - 1){
			return;
		}else if(end >= l){
			reverse(str, start, l - 1);
		}else{
			int tmp = str[start];
			str[start] = str[end];
			str[end] = tmp;

			reverse(str, start + 1, end - 1);
		}
	}
}

int main(void)
{
	char s[] = "0123456";

	reverse(s, 0, 10);
	
	printf("s : %s\n", s);

	return 0;
}
wodexiaojidan 2017-12-07
  • 打赏
  • 举报
回复
我滴个神,主函数你可以不用我们的主函数,不带字符串长度的话, 你可以用一个中间变量来swap
loveumozart 2017-12-07
  • 打赏
  • 举报
回复
错了,不是两个字符串数组,而是一个地址,一m两个int类型值
loveumozart 2017-12-07
  • 打赏
  • 举报
回复
楼上的各位看看题吧……只需要编写reverse函数,而且reverse函数接受到的实参只能是那两个字符串数组。题目上主函数已经写清楚了
wodexiaojidan 2017-12-07
  • 打赏
  • 举报
回复
Reverse(s, sizeof(s) - 1, 1, 4) : 0432156 Reverse(s, sizeof(s) - 1, 6, 10) : 0123456 Reverse(s, sizeof(s) - 1, 0, 10) : 6543210 printf("Reverse(s, sizeof(s) - 1, 0, 10) : %s\n", Reverse(s, sizeof(s) - 1, 0, 10));
wodexiaojidan 2017-12-07
  • 打赏
  • 举报
回复
#include <stdio.h>

char *Reverse(char *s, size_t l, size_t b, size_t e)
{
	if(s == NULL || b < 0){
		return NULL;
	}

	if(b >= e){
		return s;
	}else{
		if(b >= l){
			return s;
		}else if(e >= l){
			return Reverse(s, l, b, l - 1);
		}

		s[l] = s[b];
		s[b] = s[e];
		s[e] = s[l];

		s[l] = 0;
		return Reverse(s, l, b + 1, e - 1);
	}
}

int main(void)
{
	char s[] = "0123456";

	Reverse(s, sizeof(s) - 1, 0, 10);

	printf("s : %s\n", s);

	return 0;
}
真相重于对错 2017-12-07
  • 打赏
  • 举报
回复
引用 4 楼 weixin_41207175 的回复:
[quote=引用 3 楼 hdt 的回复:]
void reverse(char* str,unsigned int start,unsigned int end)
{
	if(start>strlen(str))
		return;
	if(end>strlen(str))
		end=strlen(str)-1;
	if(start<end)
	{
		char tmp = str[start];
		str[start]=str[end];
		str[end]=tmp;
	}
	else
		return;
	reverse(str,++start,--end);
}
主函数已经给出了,只能调用stdio.h和stdlib.h两个库[/quote] 举一反三 int mystrlen( char* str ) { if(str[0]=='\0') return 0; else return mystrlen(str+1)+1; }
wodexiaojidan 2017-12-07
  • 打赏
  • 举报
回复
#include <stdio.h>

char *Reverse(char *s, size_t l, size_t b, size_t e)
{
if(s == NULL || b < 0 || e >= l){
return NULL;
}

if(b >= e){
return s;
}else{
s[l] = s[b];
s[b] = s[e];
s[e] = s[l];

s[l] = 0;
return Reverse(s, l, b + 1, e - 1);
}
}

int main(void)
{
char s[] = "123456";

Reverse(s, sizeof(s) - 1, 2, 5);

printf("s : %s\n", s);

return 0;
}


s : 126543
loveumozart 2017-12-07
  • 打赏
  • 举报
回复
引用 3 楼 hdt 的回复:
void reverse(char* str,unsigned int start,unsigned int end)
{
	if(start>strlen(str))
		return;
	if(end>strlen(str))
		end=strlen(str)-1;
	if(start<end)
	{
		char tmp = str[start];
		str[start]=str[end];
		str[end]=tmp;
	}
	else
		return;
	reverse(str,++start,--end);
}
主函数已经给出了,只能调用stdio.h和stdlib.h两个库

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧