字符串思考题
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); }