对一道“写一个算法实现字符串逆序存储,要求不另设串存储空间.”题目的总结!

题目:写一个算法实现字符串逆序存储,要求不另设串存储空间.


针对这一题目给出自己的代码:

#include <stdio.h>
#include <string.h>

/* By LYG */

void rev1(char *c);
void rev2(char *c);
void rev3(char *c);

int main(void)
{
    char str[]="abcde";
    printf("原字符串为 \n%s\n",str);
    int rev;
    printf("请输入要验证的方法(1-3的整形数字):\n");
    scanf("%d",&rev);
    switch(rev)
    {
    case 1:
        rev1(str);
        printf("改变后的字符串为\n%s\n",str);
        break;
    case 2:
        rev2(str);
        printf("改变后的字符串为\n%s\n",str);
        break;
    case 3:
        rev3(str);
        printf("改变后的字符串为\n%s\n",str);
        break;
    default:
        printf("Error!");
    }

    return 0;
}
void rev1(char *ch)
/*利用
'\n'当做临时交换空间
*/
{
    int len =strlen(ch);
    for (int i = 0; i < (len-1)/ 2; i++)
    {
        ch[len]=ch[i];
        ch[i]=ch[len-1-i];
        ch[len-1-i]=ch[len];
    }
    ch[len]='\0';
}
void rev2(char *ch)
/*利用
a=a+b;
b=a-b;
a=a-b;
*/
{
    int len =strlen(ch);
    for (int i = 0; i < (len-1)/2; i++)
    {
        ch[i] = ch[i] + ch[(len - 1) - i];
        ch[(len-1) - i]= ch[i]- ch[(len -1) - i];
        ch[i] = ch[i]- ch[(len - 1) - i];
    }
}
void rev3(char *ch)
/*利用
a^=b;
b^=a;
a^=b;
*/
{
    int len =strlen(ch);
    for (int i = 0; i < (len-1)/ 2; i++)
    {

         ch[(len -1)- i] ^= ch[i];
         ch[i] ^= ch[(len -1)- i];
         ch[(len -1)- i] ^= ch[i];
    }
}

总结一下:

“字符数组或者字符串下”进行逆序存储(如char[]):

  • 不要求"不能开辟额外空间"可以用“临时变量temp”座位临时空间对"字符数组或者字符串"进行逆序存储。
  • 要求要求"不能开辟额外空间"可以用如下3种方法:

  1. 利用字符数组或者字符串独有的'\0',把'\0'所占用位置当做临时临时空间来进行逆序存储,最后在恢复'\0'.
  2. 利用
    a = a + b; 
    b = a - b; 
    a = a - b;

    来对字符数组或者字符串进行不占用额外空间的逆序存储.
  3. 利用
    a ^= b; 
    b ^= a;
    a ^= b;

    来对字符数组或者字符串进行不占用额外空间的逆序存储.

“非字符数组或者字符串下进行逆序存储”下进行逆序存储(如short a[], int a[], long a[],float a[],double a[]等类型数组):


  • 不要求"不能开辟额外空间"可以用“临时变量temp”座位临时空间对"字符数组或者字符串"进行逆序存储。
  • 要求要求"不能开辟额外空间"可以用如下2种方法:

  1. 利用
    a=a+b; 
    b=a-b; 
    a=a-b;

    来对字符数组或者字符串进行不占用额外空间的逆序存储.
  2. 利用
    a ^= b; 
    b ^= a; 
    a ^= b;

    来对字符数组或者字符串进行不占用额外空间的逆序存储.
                             



 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值