字符串思考题
1.设 S1, S2 为串,请给出使 S1+S2 == S2+S1 成立的所有可能的条件(其中 + 为连接运算)【是否可以编程??】
(1)s1或s2至少一个为空;(2)或者s1==s2;(3)或者s1、s2分别为一个前缀的若干倍。
2.写一个递归算法实现字符串逆序存储,要求不另设串存储空间。
(1)思路
交换a,b不用中间变量:
①利用字符串的结束符'\0',作为中间变量
②利用a=a+b;b=a-b;a=a-b;
③利用a=a^b;b=a^b;a=a^b;(异或)
(2)代码
#include <iostream>
using namespace std;
void reverse1(char *s){//交换a,b:a=a+b;b=a-b;a=a-b;---------应该会,之前做过【这里是字符,按数处理就行】
int n=strlen(s);//字符数,不算'\0'
for(int i=0;i<n/2;i++){
int j = n-1-i;
s[i] = s[i] + s[j];
s[j] = s[i] - s[j];
s[i] = s[i] - s[j];
}
}
void reverse2(char *s){//交换a,b:a=a^b;b=a^b;a=a^b;------------应该会,计组中
int n=strlen(s);
for(int i=0;i<n/2;i++){
int j = n-1-i;
s[i] = s[i] ^ s[j];
s[j] = s[i] ^ s[j];
s[i] = s[i] ^ s[j];
}
}
void reverse3(char *s){//用s[n]作为中间变量,最后再赋值'\0'--------机智
int n=strlen(s);
for(int i=0;i<n/2;i++){
int j = n-1-i;
s[n] = s[i];
s[i] = s[j];
s[j] = s[n];
}
s[n]='\0';
}
void main(){
char s[]="1234567";
reverse1(s);
//cout<<s<<endl;//不知道为什么,这里不能用cout,但是可以用printf
printf("%s\n",s);
reverse2(s);
printf("%s\n",s);
reverse3(s);
printf("%s\n",s);
}
作者:西伯尔
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。