字符串反转操作汇总
来源:互联网 发布:贪心算法matlab程序 编辑:程序博客网 时间:2024/05/17 09:14
//不用任何C语言函数:strlen,cout ,strcpy,
char * strrev ( char * str )
{
char *start = str;
char *left = str;
char ch;
while (*str++) ; /* find end of string */
str -= 2;
while (left < str)
{
ch = *left;
*left++ = *str;
*str-- = ch;
}
return(start);
}
解法一:第一次看到这题目,想到最简单、最直觉的解法就是:遍历字符串,将第一个字符和最后一个交换,第二个和倒数第二个交换,依次循环,即可,于是有了第一个解法:
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 *ret =str;
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* strrev4(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 = *p + *tmp;
*tmp = *p - *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);
}
以下给出一个测试程序:
int main(int argc,char* argv[])
{
char* str = "hello";
P(str);
char* str2 = strrev1(str);
P(str2);
char* str3 = strrev2(str2);
P(str3);
char* str4 = strrev3(str3);
P(str4);
char* str5 = strrev4(str4);
P(str5);
char* str6 = strrev5(str5,strlen(str5));
P(str6);
return 0;
}
你就可以看到字符串"hello"和"olleh"交替输出了。
说明:1)这里解法中没有认真考虑输入字符串的合法性和特殊长度(如NULL、一个字符等)字符串的处理;2)前4个算法不改变输入字符串的值,解法五修改了输入字符串。
- 字符串反转操作汇总
- 反转字符串操作
- C字符串操作:字符串反转
- Java_字符串反转操作学习
- SQL字符串操作汇总
- SQL字符串操作汇总
- SQL字符串操作汇总
- SQL字符串操作汇总
- Freemaker操作字符串汇总
- SQL字符串操作汇总
- 字符串操作汇总
- 常见字符串操作汇总
- 字符串操作知识汇总
- Python字符串操作汇总
- C# 字符串操作汇总
- C# 字符串操作汇总
- 字符串去空格以及反转操作示例
- 面试基础_01字符串反转操作
- Java程序员从笨鸟到菜鸟之(十二)java异常处理机制
- HBase Coprocessor 剖析与编程实践
- 360于光东:360搜索不会借捆绑安全卫士推广
- 面向对象设计原则
- 网络编程模型综述 之 成熟的IO框架介绍
- 字符串反转操作汇总
- oracle contains(运算符)函数 全文检索
- cocos2d-x 适应不同分辨率 (转)
- linux free -m命令
- 为什么增量必须要是“完成的”
- [转载]程序员该如何去写自己的简历-代码而成的简历@http://blog.csdn.net/phodal/article/details/12908939
- GCC内联汇编基础
- eclipse中复制一行
- 千万别这么用linq,超级慢