字符串思考题

字符串思考题

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);
}

猜你喜欢

转载自www.cnblogs.com/sybil-hxl/p/10468463.html