以单词为单位反转字符串,要求不申请任何空间
来源:互联网 发布:linux任务管理器快捷键 编辑:程序博客网 时间:2024/04/30 08:47
问题描述:
存在一个可读写的字符串,其中包括若干单词,单词间以空格区分,要求以单词为单位对字符串进行反转。
算法思想:
(1)利用异或运算可以进行不申请空间进行字符交换
(2)利用递归的思想
(3)使用strchr函数区分单词
解决方案:
(1)利用递归和异或运算进行字符交换,这一步将完成字符串的整体反转
// 递归进行字符交换void recursive_swap_char(char* lhs, char* rhs){if(rhs <= lhs)return;*lhs ^= *rhs;*rhs ^= *lhs;*lhs ^= *rhs;recursive_swap_char(lhs + 1, rhs - 1);}
(2)逐个对字符串内的单词进行反转,则完成以单词为单位的反转
// 递归进行单词中字符反转void recursive_word_reverse(char* cur, char* next){// 如果是最后一个单词,按字符串进行反转if(next == NULL){recursive_swap_char(cur, cur + strlen(cur) - 1);return;}// 当前单词内进行字符反转recursive_swap_char(cur, next - 1);// 反转下一个单词recursive_word_reverse(next + 1, strchr(next + 1, ' '));}
完整代码:
#include <iostream>#include <tchar.h>using namespace std; // 递归进行字符交换void recursive_swap_char(char* lhs, char* rhs){if(rhs <= lhs)return;*lhs ^= *rhs;*rhs ^= *lhs;*lhs ^= *rhs;recursive_swap_char(lhs + 1, rhs - 1);}// 递归进行单词中字符反转void recursive_word_reverse(char* cur, char* next){// 如果是最后一个单词,按字符串进行反转if(next == NULL){recursive_swap_char(cur, cur + strlen(cur) - 1);return;}// 当前单词内进行字符反转recursive_swap_char(cur, next - 1);// 反转下一个单词recursive_word_reverse(next + 1, strchr(next + 1, ' '));}char* reverse_by_word(char* src){// 如果只有一个单词,则直接返回if(strchr(src, ' ') == NULL)return src;// 整体字符串反转recursive_swap_char(src, src + strlen(src) - 1);// 反转单词recursive_word_reverse(src, strchr(src, ' '));return src;}void print(char* src){cout << "src: " << src << endl;cout << "dest: " << reverse_by_word(src) << endl;}int _tmain(int argc, _TCHAR* argv[]){char one[] = "one";char one_two[] = "one two";char one_two_three[] = "one two three";char one_two_three_four[] = "one two three four";char str_for_test[] = "There is a program for test";print(one);print(one_two);print(one_two_three);print(one_two_three_four);print(str_for_test);return 0;}
运行结果:
附注:
(1)在网上搜到过别的同学的解法,反转字符串时采用结尾字符('/0')逐次前进的操作,即不断调用strlen,或者移位,或者加法运算,同时递归。而这里采用快速排序的思想,进行前后两个指针相互靠拢进行字符交换的递归调用,由于是在一个字符串进行操作,因而利用了指针的比较操作是有意义的。
(2)这里使用的是单词间只有一个空格,并且最后一个单词后没有空格。可能也会出现单词间有多个空格的情况,解法就需要计算空格的个数,同样可以通过strchr函数实现。
- 以单词为单位反转字符串,要求不申请任何空间
- 以单词为单位反转字符串,要求不申请任何空间
- 以单词为单位,对字符串进行反转
- 不用任何库函数实现以单词为单位的字符串逆转算法(C#)
- 字符串以单词为单位进行反转,并且必须保留原有分隔符及其个数
- 以单词为最小单位翻转字符串
- 以单词为单位的翻转字符串
- 以单词为单位的翻转字符串
- 要求:不申请变量和空间反转字符串,用一个函数实现。VIA笔试题
- 不申请变量和空间反转字符串
- 不申请新的空间,字符串反转
- 以单词为单位进行的字符串翻转
- 实现以单词为单位的翻转字符串
- 以单词为单位倒序输出一个字符串
- 要求:不申请变量和空间 反转字符串 ,用一个函数实现。 异或^交换或者加减交换的典型应用! VIA 笔试题
- 字符串反转--单词不逆序
- 反转字符串但单词不反转
- 面试- 字符串反转 单词不反转
- [恶搞]【2011/6/5】小龙虾个头小了 价格涨了
- CSDN死了
- VISUAL STUDIO 2008环境下的CUDA配置(cuda toolkit 4.0)
- Image实现鼠标的拖动(自己做的图片显示控件)
- .NET实现之(WebBrowser数据采集—终结篇)
- 以单词为单位反转字符串,要求不申请任何空间
- JavaEE应用程序在Glassfish上的性能调优案例分析
- 10G custom创建数据库中安装示例方案(sample schemas)
- 搜索框中“请输入搜索关键字”
- 军衔
- jquery-1.2.1.js
- editTable.js
- countDown
- asp.net Http 请求处理流程