[算法]1.字符的翻转问题
来源:互联网 发布:mac卡住了怎么办 编辑:程序博客网 时间:2024/05/04 00:22
题目
原始字符串为”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:defabcorigin2:defabcorigin3:defabc
0 0
- [算法]1.字符的翻转问题
- 字符数组的翻转
- 字符数组的翻转
- 字符串翻转的问题
- 优先级翻转的问题
- 字符串的翻转问题
- 字符翻转
- 字符翻转
- 算法导论 红黑树的翻转
- 归纳算法——硬币翻转问题
- 字符组合问题的分治算法
- [算法设计-字符的全排列问题]
- CCOrbitCamera 翻转图片的问题
- java算法实现之--输入一个英文句子,翻转句子中的单词顺序,但单词内字符的顺序不变
- 剑指offer之字符数组内容翻转问题
- string字符串的翻转---(子字符串不翻转)问题
- 用函数实现单链表翻转的算法
- 排列的生产算法 翻转法
- QR码 二维码
- android自学之第一个HelloWorld程序
- PHP读写JSON文件以及jQuery的getJSON函数用法
- unity Attribute
- Unity3D - 关于Dynamic和Static
- [算法]1.字符的翻转问题
- js延迟执行函数
- python字符编码问题的总结
- printf() , scanf() , 赋值运算符 ,
- ubuntu 16.04 mysql5.7.17 开放远程3306端口
- EJB到底是什么
- [转载]Linux 释放内存命令
- 技能库--第三方账户登录系统设计(86)
- 快速排序(Quicksort)的Javascript实现