笔记2(字符串翻转)
来源:互联网 发布:linux怎么运行sh脚本 编辑:程序博客网 时间:2024/04/20 20:08
转自:点击打开链接
这是网络流传的Microsoft的面试题目之一:“编写反转字符串的程序,要求优化速度、优化空间”。因为最近一直很多关注算法方面的实践和研究,因此对这个问题进行了一些思考,给出了5种实现方法(有两种解法相关性比较大)。
解法一:第一次看到这题目,想到最简单、最直觉的解法就是:遍历字符串,将第一个字符和最后一个交换,第二个和倒数第二个交换,依次循环,即可,于是有了第一个解法:
char* strrev1(const char* str){ int len = strlen(str); char* tmp = new char[len + 1]; strcpy(tmp,str); for (int i = 0; i < len/2; ++i) { char c = tmp[i]; tmp[i] = tmp[len – i - 1]; tmp[len – i - 1] = c; } return tmp;}
这里是通过数组的下标方式访问字符串的字符,实际上用指针直接操作即可。解法二正是基于此,实现代码为:
char* strrev2(const char* str){ char* tmp = new char[strlen(str) + 1]; strcpy(tmp,str); char* ret = tmp; char* p = tmp + strlen(str) - 1; while (p > tmp) { char t = *tmp; *tmp = *p; *p = t; --p; ++tmp; } return ret;}
显然上面的两个解法中没有考虑时间和空间的优化,一个典型的优化策略就是两个字符交换的算法优化,我们可以完全不使用任何外部变量即完成两个字符(或者整数)的交换,这也是一个很经典的面试题目。特别是一些嵌入式硬件相关编程中经常要考虑寄存器的使用,因此经常有不使用任何第三个寄存器即完成两个寄存器数据的交换的题目。一般有两个解法,对应这里的解法三和解法四。
解法三的实现代码为:
char* strrev3(const char* str){ char* tmp = new char[strlen(str) + 1]; strcpy(tmp,str); char* ret = tmp; char* p = tmp + strlen(str) - 1; while (p > tmp) { *p ^= *tmp; *tmp ^= *p; *p ^= *tmp; --p; ++tmp; } return ret;}
实际上我们还可以通过递归的思想来解决这个问题,思想很简单:每次交换首尾两个字符,中间部分则又变为和原来字符串同样的问题,因此可以通过递归的思想来解决这个问题,对应解法四的实现代码为:
char* strrev5(/*const */char* str,int len){ if (len <= 1) return str; char t = *str; *str = *(str + len -1); *(str + len -1) = t; return (strrev5(str + 1,len - 2) - 1);}
0 0
- 笔记2(字符串翻转)
- 递归系列2(字符串翻转,12345翻转)
- 容易_53_翻转字符串(2)
- 2、字符串翻转
- 翻转字符串(LintCode)
- 字符串翻转(Java)
- 字符串翻转(顺序翻转,每个子字符串顺序不变)
- string字符串的翻转---(子字符串不翻转)问题
- 字符串的翻转(递归)
- 编程练习3---字符串(字符串翻转)
- HDU 1062 字符串翻转(字符串,水)
- 翻转字符串
- 翻转字符串
- 字符串翻转
- 字符串翻转
- 翻转字符串
- 翻转字符串
- 字符串翻转
- treap分离合并 区间操作 poj 3468
- UIApplicationDelegate详解
- Android底部菜单栏(用TabHost一次性加载耗内存)
- 计算程序运行时间的函数clock()
- 【SQL Server DBA】日常巡检1:数据库空间、状态、使用的监控
- 笔记2(字符串翻转)
- OCP-1Z0-053-V13.02-445题
- android 语言国际化 + 点击按钮出现menu + 点击menu出现dialog对话框 + radiobutton 点击事件
- zeromq
- xml、properties配置文件的读取
- 分治法,循环赛日程表
- jquery学习心得,常用的操作
- android JNI学习六
- cocos2dx-jsb 跨语言调用