题目:编写一个单词逆序输出的算法,例如输入“SEE YOU IN ANOTHER LIFE”,要求输出“LIFE ANOTHER IN YOU SEE”。

解答:

解法一:只需扫描一遍:

#include <iostream>

void ReverseWord(const char* src, char* dest)

{

assert(src != NULL && dest != NULL);

const char* head = src; //记住头指针

while(*src++);

int count = 0;

for(src -= 2;;src--) //从尾到头遍历

{

if(src == head) //到头部额,退出循环

{

do

{

*dest++ = *src++;

} while(count--);

break;

}

if(*src == ' ') //遇到空格

{

const char* temp = src + 1;

while(count--)

{

*dest++ = *temp++;

}

*dest++ = ' ';

count = 0;

}

else

{

count++; //计算每个单词的长度

}

}

*dest = '/0';

}

int main()

{

const char* str = "SEE YOU IN ANOTHER LIFE";

char *dest = new char[strlen(str) + 1];

ReverseWord(str, dest);

std::cout<<str<<std::endl;

std::cout<<dest<<std::endl;

system("pause");

return 0;

}

解法二:扫描两遍。即简单地将所有字符反转,遍历字符串,将第一个字符和最后一个字符交换,第二个和倒数第二个交换,依次循环。接着进行第二次遍历,对每个单词反转一次,这样每个单词就恢复成原有顺序,得到题目要求的功能了:

#include <iostream>

char* ReverseWord(const char* str)

{

assert(str != NULL);

int len = strlen(str);

char* restr = new char[len + 1];

strcpy(restr, str);

//第一次扫描,头尾反转

for(int i=0, j=len-1; i<j; i++,j--)

{

//首尾交换

restr[i] ^= restr[j];

restr[j] ^= restr[i];

restr[i] ^= restr[j];

}

int k = 0;

while(k < len) //第二次扫描,将每个单词反转

{

int i, j; //i记录每个单词开始位置,j记录每个单词结束位置

i = j = k;

while(restr[j] != ' ' && restr[j] != '/0')

{

j++;

}

k = j+1; //为跳过空格,为下一轮循环做准备

j--; //回退一步,去掉空格

for(;i<j; i++, j--)

{

restr[i] ^= restr[j];

restr[j] ^= restr[i];

restr[i] ^= restr[j];

}

}

return restr;

}

int main()

{

const char* str = "SEE YOU IN ANOTHER LIFE";

char *dest = ReverseWord(str);

std::cout<<str<<std::endl;

std::cout<<dest<<std::endl;

system("pause");

return 0;

}

题目:给定一个字符串,一个这个字符串的子串,将第一个字符串反转,但保留子串的顺序不变。例如:

输入:第一个字符串:“See you in another life”

子串:“in”

输出:“efil rehtona in uoy eeS”

解答:一般的方法是先扫描一遍第一个字符串,用stack把它反转,同时记录下子串出现的位置;然后再扫描一遍反转后的字符串,扫描过程中将原来子串再反转,其他的不变,这样就得到答案了。

那么只扫描一遍怎么办呢?只需在扫描的过程中将子串反序压入堆栈;扫描完之后,将堆栈中字符弹出,这样子串就还是原来的顺序了。实现代码如下:

#include <iostream>

#include <cassert>

#include <stack>

const char* reverse(const char* s1, const char* token)

{

assert(s1 && token);

std::stack<char> stackOne;

const char* ptoken = token;

const char* head = s1;

const char* rear = s1;

while(*head != '/0')

{

while(*head != '/0' && *ptoken == *head)

{

ptoken++;

head++;

}

if(*ptoken == '/0') //包含字符串token

{

const char* p;

for(p=head-1; p>=rear; p--) //从尾到头将token存入堆栈

{

stackOne.push(*p);

}

ptoken = token;

rear = head;

}

else //不是分割的字符串

{

stackOne.push(*rear);

head = ++rear;

ptoken = token;

}

}

char* ret = new char[strlen(s1)+1];

int i = 0;

while(!stackOne.empty()) //非空

{

ret[i++] = stackOne.top();

stackOne.pop();

}

ret[i] = '/0';

return ret;

}

int main()

{

std::cout<<"See you in another life"<<std::endl;

std::cout<<reverse("See you in another life", "in")<<std::endl;

system("pause");

return 0;

}

《算法之美》の字符串相关问题の壹相关推荐

  1. Algorithm:C++语言实现之字符串相关算法(字符串的循环左移、字符串的全排列、带有同个字符的全排列、串匹配问题的BF算法和KMP算法)

    Algorithm:C++语言实现之字符串相关算法(字符串的循环左移.字符串的全排列.带有同个字符的全排列.串匹配问题的BF算法和KMP算法) 目录 一.字符串的算法 1.字符串的循环左移 2.字符串 ...

  2. JAVA算法:回文字符串相关问题详解(回文字符串总结)

    JAVA算法:回文字符串相关问题详解(回文字符串总结) Q1. 编写一个工具方法判断给定的字符串是否为回文字符串 例如:给定一个字符串"aabbaa",判断该字符串是否为回文字符串 ...

  3. 20个经典数据结构与算法,300多幅算法手绘图解,带你领略算法之美

    一些经典的数据结构和算法图书,偏重理论,读者学起来可能感觉比较枯燥.一些趣谈类的数据结构和算法图书,虽然容易读懂,但往往内容不够全面.另外,很多数据结构和算法图书缺少真实的开发场景,读者很难将理论和实 ...

  4. C语言面试高频问题:自己代码实现字符串相关的常用API

    参考:C语言面试高频问题:自己代码实现字符串相关的常用API 作者:图触靓 发布时间: 2020-08-08 13:31:33 网址:https://blog.csdn.net/bhbhhyg/art ...

  5. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  6. 《算法之美》-- 读书笔记(4)-- 2019

    一.书本基本信息 书名:<算法之美(将计算机科学的智慧转化为明智的生活决策)> 作者:布莱恩·克里斯汀; 汤姆· 格里菲思 出版社:中信出版社 二.读后感 1.本书将基本的计算机科学中使用 ...

  7. 数据结构与算法之美(一):概论

    最近在极客时间上面学习王争老师的课程<数据结构与算法之美>,以前虽然学过一些皮毛,但是不够精,作为程序员的基本内功,还是要继续学习.至此通过总结的方式,把这门课的要点记录下来,供自己思考回 ...

  8. 《算法之美》 第三章:数据结构

    文章目录 前言 一.数据结构基础 二.数据结构分解 1.数组 2.链表 3.栈 4.队列 5.树 6.图 总结 前言 好久没更,因为笔者前段时间处理了一些其他的问题,今天我们继续,走进<算法之美 ...

  9. 极客时间 自我提升第二天 数据结构与算法之美 应该掌握 / 趣谈网络原理 / 深入浅出计算机组成原理 思维导图

    菜鸟今天又来完成所说的诺言,也希望大家督促,在今天的学习中,菜鸟有了新的认知,我会将上一篇中理解不完善的一些地方进行补充,学习本就是不断打破自己的认知,如果思考都不做,何来的知识的积累 文章目录 数据 ...

最新文章

  1. sublime Text3安装和verilog安装
  2. 流程控制 - PHP手册笔记
  3. Winform中设置ZedGraph曲线图的水平与竖直参考线
  4. Emlog精简模板无繁琐操作,适合新手
  5. c++ 测试串口速率_山西充放电测试设备实现多台仪器准确通
  6. [Common 17-39] ‘connect_bd_intf_net‘ failed due to earlier errors. 的解决办法
  7. java标识符定义_Java标识符命名规范
  8. 【转载】Java工程师路线图
  9. 2021-1-30Linux学习纪要
  10. grunt入门讲解4:如何创建task(任务)
  11. linux 分区顺序 boot,关于Liunx下的硬盘分区问题(/boot分区)?
  12. vim个性化设置---给脚本文件加注释头信息
  13. 学计算机编程应该先学什么,如何自学计算机编程,学编程应该先学什么
  14. [4G5G专题-101]:部署 - LTE FDD与LTE TDD技术差异比较详解
  15. 利用Python查找出Android项目中未使用的string
  16. 服务器系统盘如何克隆,如果把云服务器系统盘克隆
  17. matlab拟合多自变量函数,matlab曲线拟合公式中含有两个变量,x是自变量,y既是自变量又是因变量,求指导,y=f(x,y)...
  18. 宝塔一键安装部署tipask登录出现错误:The email must be at least 8 characters怎么回事
  19. 图片怎么批量压缩?这两个方法有掌握吗
  20. 错误 3 error C2181: 没有匹配 if 的非法 else c:\users\zhong\desktop\我的程序\c++qt程序\test\sineware\sineware\sinewa

热门文章

  1. OGC标准wms、wmts、wfs等地图服务协议规范 及 arcgis 的永久WMTS 谷歌卫星 卫星影像服务
  2. Unity MRTK使用详解(Htc vive+LeapMotion)
  3. 深富策略科技股继续强势
  4. Shell文本处理编写单行指令的诀窍
  5. OpenCV在Android上踩过的坑
  6. 数字化转型:转什么,如何转?
  7. C语言每日一练——第75天:谜语博士的难题(二)
  8. python 训练好的模型怎么保存_如何保存训练好的机器学习模型
  9. 一个263企业邮箱白名单的处理
  10. Zabbix对硬件DELL服务器监控