博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
依照特定轨迹遍历字符串图
阅读量:4329 次
发布时间:2019-06-06

本文共 1340 字,大约阅读时间需要 4 分钟。

题目大致是这样的,

字符串“PAYPALISHIRING”的一种“之”字型路线是这样的:
这里写图片描写叙述
假设一行一行的读写,就是PAHNAPLSIIGYIR。

所以,假设输入PAHNAPLSIIGYIR和3,就是横着的字符串和层数,输出N轨迹的字符PAYPALISHIRING。

首先想到的是怎样 将输入字符串。切割开来,比方上面是3层,分成3个字符串,这三个字符串一定是连续的

第一段+第二段+第三段
如今的难题是怎么推断每一段的长度。

将上面的图抽象化
这里写图片描写叙述
就是这样的,每个圆代表一个字符。这事实上是有规律的。

例如以下

这里写图片描写叙述
这样每一层的个数和这个周期之间是有关系的
base=(字符总个数/(层数+层数-2))
第一层个数=base+x
最后一层=base+x
其它层=base×2+x。
这里写图片描写叙述
这里面的x表示(如上图)绿色的圆的补偿,比方如以下4个绿色圆,
base=20/8=2
第一层=2+1=3;
第二层=2×2+1=5。
第三层=2×2+1=5;
第四层=2×2+1=5;
最后一层=2+0=2;
假设是以下这样的情况
这里写图片描写叙述
事实上算法也是一样的仅仅要对于补偿x值修正就能够了。本次就不讨论这样的情况了。


这里写图片描写叙述

到达这一步时,将之前的切割成了3部分,然后进行N轨迹遍历,
初步方案是。给三个字符串编号1、2、3.然后依照12321232123的遍历直到结束
所以如今须要解决的问题是,怎样实现这样的循环的遍历。

这里想到在cpu中有个寄存器用于决定地址是加一还是减一操作,所以借用这样的思想。例如以下方案

这里写图片描写叙述
实现函数例如以下

string  convert(string text,int nRow)//text为输入字符串 nRow是层数{ string r; vector 
m; int arry[251]={
0}; int len=text.size(); int s,c; s=len/(2*nRow-2); //base数据 c=len%(2*nRow-2); //为上面绿色的个数 for(int i=1;i<=nRow;++i) { if(i==1) //计算第一层的个数 { if(c>=1) arry[i]=s+1; //arry的下标表述层数,内容为当前层的个数 else arry[i]=s; } else if(i==nRow) //计算最后一层的个数 { if(c>=nRow) arry[i]=s+1; else arry[i]=s; } else //中间层的个数 { if(c>=i&&) arry[i]=2*s+1; else arry[i]=2*s; } } m.resize(nRow+1); int loc; int base; base=0; for(int i=1;i<=nRow;++i) //依据每一层的个数,切割字符串 { base+=arry[i-1]; for(int j=0;j

转载于:https://www.cnblogs.com/cxchanpin/p/7221390.html

你可能感兴趣的文章
MySQL 处理重复数据
查看>>
关于typedef的用法总结(转)
查看>>
【strtok()】——分割字符串
查看>>
Linux下安装rabbitmq
查看>>
曹德旺
查看>>
【转】判断点在多边形内(matlab)
查看>>
java基础之集合:List Set Map的概述以及使用场景
查看>>
Python 线程 进程 协程
查看>>
iOS语言中的KVO机制
查看>>
excel第一次打开报错 向程序发送命令时出错 多种解决办法含终极解决方法
查看>>
响应式web设计之CSS3 Media Queries
查看>>
实验三
查看>>
机器码和字节码
查看>>
环形菜单的实现
查看>>
【解决Chrome浏览器和IE浏览器上传附件兼容的问题 -- Chrome关闭flash后,uploadify插件不可用的解决办法】...
查看>>
34 帧动画
查看>>
二次剩余及欧拉准则
查看>>
Centos 7 Mysql 最大连接数超了问题解决
查看>>
thymeleaf 自定义标签
查看>>
关于WordCount的作业
查看>>