您的位置:首页 > 编程语言 > C语言/C++

C\C++笔试题IV---翻转字符串

2013-04-07 21:24 267 查看
这也是笔试中一道经典的C语言题:

给定一个字符串,将其翻转。如abc ==> cba

拿到此题时,我是想都没想,直接说,再用一个字符串tmp来缓存一下此串,然后一个for循环赋值搞定。

思路有了,代码就有了。

[cpp] view plaincopyprint?

#include <stdio.h>

#include <stdlib.h>

int main()

{
char string[20],tmp[20];

int length;

printf("please input less than 20 char:");

scanf("%s",string);

printf("your input string is %s\n",string);

length = strlen(string);

printf("length is %d\n",length);

for(int i = 0;i<length;++i)

{
tmp[i] = string[i];
}
for(int i = 0;i<length;++i)

{
string[i] = tmp[length-i-1];
}
printf("after revert:%s\n",string);

return 0;

}

#include <stdio.h>
#include <stdlib.h>

int main()
{
char string[20],tmp[20];
int length;

printf("please input less than 20 char:");
scanf("%s",string);
printf("your input string is %s\n",string);

length = strlen(string);
printf("length is %d\n",length);

for(int i = 0;i<length;++i)
{
tmp[i] = string[i];
}
for(int i = 0;i<length;++i)
{
string[i] = tmp[length-i-1];
}
printf("after revert:%s\n",string);
return 0;
}
用gcc编译:gcc -o revert revert_string.c -std=c99

后运行,结果如我所料。但是我这个算法太不优雅了,因为将两个字符数组赋值就用了一个循环,然后翻转时再用一个循环,这效率真是不敢恭维。

优雅的方法应该是这样的思路:

找到这个字符串的中间位置,然后将其左边的字符与右边的字符交换位置。

实现起来应该是下面这样:

[cpp] view plaincopyprint?

#include <stdio.h>

#include <stdlib.h>

int main()

{
char string[20], tmp;

int length;

printf("please input less than 20 char:");

scanf("%s",string);

printf("your input string is %s\n",string);

//get string length,very useful method

for(length=0;string[length];length++)

;

printf("length is %d\n",length);

//very beateful !!!

for(int i=0;i<length/2;i++)

{
tmp = string[i];
printf("tmp is %c\n" ,string[i]);

string[i] = string[length-i-1];
printf("string[%d] is %c\n",i,string[length-i-1]);

string[length-i-1] = tmp;
printf("string[%d] is %c\n",length-i-1,tmp);

}
printf("after revert:%s\n",string);

return 0;

}

#include <stdio.h>
#include <stdlib.h>

int main()
{
char string[20], tmp;
int length;

printf("please input less than 20 char:");
scanf("%s",string);
printf("your input string is %s\n",string);

//get string length,very useful method
for(length=0;string[length];length++)
;

printf("length is %d\n",length);

//very beateful !!!
for(int i=0;i<length/2;i++)
{
tmp = string[i];
printf("tmp is %c\n" ,string[i]);
string[i] = string[length-i-1];
printf("string[%d] is %c\n",i,string[length-i-1]);
string[length-i-1] = tmp;
printf("string[%d] is %c\n",length-i-1,tmp);
}
printf("after revert:%s\n",string);
return 0;
}
运行效果如下:

[plain] view plaincopyprint?

D:\workspace\C\revert_string>gcc -o revert revert_string.c -std=c99

D:\workspace\C\revert_string>revert

please input less than 20 char:abc

your input string is abc

length is 3
tmp is a
string[0] is c
string[2] is a
after revert:cba

D:\workspace\C\revert_string>revert

please input less than 20 char:abcd

your input string is abcd
length is 4
tmp is a
string[0] is d
string[3] is a
tmp is b
string[1] is c
string[2] is b
after revert:dcba

D:\workspace\C\revert_string>gcc -o revert revert_string.c -std=c99

D:\workspace\C\revert_string>revert
please input less than 20 char:abc
your input string is abc
length is 3
tmp is a
string[0] is c
string[2] is a
after revert:cba

D:\workspace\C\revert_string>revert
please input less than 20 char:abcd
your input string is abcd
length is 4
tmp is a
string[0] is d
string[3] is a
tmp is b
string[1] is c
string[2] is b
after revert:dcba


这样的算法,相比之前要提高甚多效率。只要开动脑筋,世界会更加优雅。

 

 

 

题目如下: 写一个函数,将字符串翻转,翻转方式如下:“I am a student”反转成“student a am I”,不借助任何库函数。

方法1(自己写的) #include<stdio.h>

点击(此处)折叠或打开

#include<stdlib.h>

char* reserve(char* str);

int get_length(char
*str);

int main(void)

{

char *str="I am a student";

str="you are a student";

char *result=reserve(str);

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

free(result);

result=NULL;

str=NULL;

return 0;

}

int get_length(char
*str)

{

int length=-1;

if(str!=NULL)

{

length=0;

while(*str++!='\0')

{

length++;

}

}

return length;

}

char* reserve(char* str)

{

int i=get_length(str);

printf("%d\n",i);

char* result=malloc(sizeof(char)*(i+1));

if(result==NULL)

{

printf("%s\n","allocate string failed");

exit(1);

}

char* temp=malloc(sizeof(char)*i);

if(temp==NULL)

{

printf("%s\n","allocate string failed");

exit(2);

}

char c='\0';

int n=i-1;

int m=0;

c=*str;

while(c!='\0')

{

if(
')

{

temp[m++]=c;

}

else

{

for(m=m-1;m>=0;m--)

{

result[n--]=temp[m];

}

result[n--]=c;

m=0;

}

str++;

c=*str;

}

for(m=m-1;m>=0;m--)

{

result[n--]=temp[m];

}

free(temp);

temp=NULL;

return result;

}

方法2(从网上收集过来的)

点击(此处)折叠或打开

#include
<stdio.h>

void main()

{

char str[]="you are a student";

printf(str);

printf("\n");

char *p,*q;

char temp;

p=q=str;

while(*q!='\0')

{

q++;

}

q--;

while(p<=q)

{

temp=*p;

*p=*q;

*q=temp;

p++;

q--;

}//反转整个字符串

printf(str);

printf("\n");

char *s;

q=p=s=str;//指针指向开始位置

while(*q!='\0')

{

if(*q=='
'||*(q+1)=='\0')

{

p--;

if(*(q+1)=='\0')//处理最后一个字串

p++;

while(s<=p)

{

temp=*p;

*p=*s;

*s=temp;

s++;

p--;

}//反转局部字符串

s=q+1;

p=q;

}

q++;

p++;

}

printf(str);

printf("\n");

}

方法3(传说中是《程序员面试宝典》里的方法,不过我没有看过这本书,也没去验证): #include <iostram>

点击(此处)折叠或打开

#include
<stdio.h>

int main(void)

{

int num=-12345,j=0,i=0,flag=0,begin,end;

char str[]="I am a student",temp;

j=strlen(str)-1;

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

//第一步是进行全盘反转,将单词变成“tneduts a ma I”

while(j>i)

{

temp=str[i];

str[i]=str[j];

str[j]=temp;

j--;

i++;

}

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

int i=0;

//第二步进行部分反转,如果不是空格则开始反转单词

while(str[i])

{

if(str[i]!='
')

{

begin=i;

while(str[i]&&str[i]!='
')

{

i++;

}

i=i-1;

end=i;

}

while(end>begin)

{

temp=str[begin];

str[begin]=str[end];

str[end]=temp;

end--;

begin++;

}

i++;

}

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

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: