[算法]1.字符的翻转问题

题目

原始字符串为”abcdef”,请设计算法转换为”defabc”。

思路一

初始的想法可以是可以通过暴力转换的方式去实现。通过观察原始字符串和目标字符串的区别可以发现,转换的过程可以看作是字符串的循环移动过程;将原始字符串往前移动3个位置就可以实现目标。有了思路就可以实现具体的代码了:

  char origin[]="abcdef";

  for(int i=0;i<3;i++){
    char tempchar(origin1[0]);
    for(int i=0;i<6;i++){
      origin1[i]=origin[i+1];
    }
    origin[5]=tempchar;
  }
  cout<<"origin1:"<<origin1<<endl;// space o(1) time o(m*n)

本思路的空间复杂度为O(1),时间复杂度O(n)。

思路二

再仔细观察原始和目标字符串之间的区别,可以发现它们之间的区别其实就是第一位开始依次与后3位的字符互换。因此可以编写如下的代码:

  char origin[]="abcdef";

   for(int i=0;i<3;i++){
    char tt;
    tt=origin2[i];
    origin2[i]=origin2[i+3];
    origin2[i+3]=tt;
  }
  cout<<"origin2:"<<origin2<<endl;// space o(1) time o(n)

本思路的空间复杂度为O(1),时间复杂度为O(n).

思路三

对于原始字符串可以理解为以中间字符为中心翻转之后达到目标字符串。

  • 第一步:abc进行旋转,旋转之后成为cba;
  • 第二步:def进行旋转,旋转之后成为fed;
  • 第三步:将部分翻转之后的字符串cbafed进行反转,翻转之后为:defabc达到目标。

实现代码如下:

  char origin[]="abcdef";
  int from=0;
  int to=2;
  while(from<to){
    char temp=origin3[from];
    origin[from]=origin3[to];
    origin[to]=temp;
    from++;
    to--;
   }

   from=3;
   to=5;
   while(from<to){
     char temp=origin[from];
     origin[from]=origin3[to];
     origin[to]=temp;
     from++;
     to--;
   }

   from=0;
   to=5;
   while(from<to){
     char temp=origin[from];
     origin[from]=origin3[to];
     origin[to]=temp;
     from++;
     to--;
   }
  cout<<"origin3:"<<origin3<<endl;// space o(1) time o(n)
}

本思路的时间复杂度为O(n),空间复杂度为O(1)。

最后附上详细的代码:

#include <iostream>
int main(){
    //思路1  
    char origin1[]="abcdef";
    char des[]="defabc";

    for(int i=0;i<3;i++){
    char tempchar(origin1[0]);
    for(int i=0;i<6;i++){
      origin1[i]=origin1[i+1];
    }
    origin1[5]=tempchar;
    }
    cout<<"origin1:"<<origin1<<endl;// space o(1) time o(m*n)
    //思路2
   char origin2[]="abcdef";
    for(int i=0;i<3;i++){
        char tt;
        tt=origin2[i];
        origin2[i]=origin2[i+3];
        origin2[i+3]=tt;
    }
    cout<<"origin2:"<<origin2<<endl;// space o(1) time o(n)
    //思路3
   char origin3[]="abcdef";
   int from=0;
   int to=2;
   while(from<to){
       char temp=origin3[from];
       origin3[from]=origin3[to];
       origin3[to]=temp;
       from++;
       to--;
   }


   from=3;
   to=5;
   while(from<to){
       char temp=origin3[from];
       origin3[from]=origin3[to];
       origin3[to]=temp;
       from++;
       to--;
   }


   from=0;
   to=5;
   while(from<to){
       char temp=origin3[from];
       origin3[from]=origin3[to];
       origin3[to]=temp;
       from++;
       to--;
   }
   cout<<"origin3:"<<origin3<<endl;// space o(1) time o(n)
}

输出为:

origin1:defabc
origin2:defabc
origin3:defabc
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值