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;
}
后运行,结果如我所料。但是我这个算法太不优雅了,因为将两个字符数组赋值就用了一个循环,然后翻转时再用一个循环,这效率真是不敢恭维。
优雅的方法应该是这样的思路:
找到这个字符串的中间位置,然后将其左边的字符与右边的字符交换位置。
实现起来应该是下面这样:
[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;
}
[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
这样的算法,相比之前要提高甚多效率。只要开动脑筋,世界会更加优雅。
题目如下: 写一个函数,将字符串翻转,翻转方式如下:“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;
}
给定一个字符串,将其翻转。如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;
}
相关文章推荐
- 每天一道C\C++笔试题IV---翻转字符串
- C/C++字符串笔试知识点及实例
- C++面试笔试题目(选2)(字符串,原码反码补码)
- c++作业记录,统计字母&字符串翻转
- 笔试题目“翻转字符串”的实现
- 翻转字符串-goso笔试题
- 【c++】【2015华为笔试】分解字符串
- 去哪儿网C++笔试题--二分查找、最先出现两次的字符、每个字符串中的单词个数
- 笔试题:字符串翻转-python
- 【c++】【2015华为笔试】分解字符串
- java笔试中字符串翻转的几种方法(java---华为----字符逆序)
- c++实现字符串翻转
- C/C++笔试题之删除字符串中某些字符
- 字符串翻转(C++)
- c++中静态成员变量 静态成员函数 全局变量与静态函数的关系 字符串中括号的匹配编程 (笔试经历)
- 谷歌笔试题-去除连续空格并翻转字符串
- C++笔试题(剑指offer 面试题4 替换字符串中的空格)
- #笔试#字符串 匹配 正则表达式 C++
- C/C++:递归使用:使用递归反向写文件(例子)以及字符串翻转输出
- C++ <利用指针翻转字符串>