按照特定轨迹遍历字符串图
来源:互联网 发布:淘宝的降价通知 编辑:程序博客网 时间:2024/05/13 08:47
题目大致是这样的,
字符串“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 <string> 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<arry[i];++j) { loc=j+base; m[i].push_back(text[loc]);//m[i]保存每一层的字符串, } } int flag=0; //~0 addr++ 0 add-- int cnt=1; int* num=new int[nRow+1]();//下面是在分割完成后的循环遍历 int x,y; int tol=text.size(); while(1) { tol--; if(tol<0) break; x=cnt; y=num[cnt]; r.push_back(m[x][y]); num[cnt]++; if(cnt==nRow || cnt==1) flag=~flag; if(flag!=0) cnt++; else cnt--; } cout<<r<<endl; return r;}
1 0
- 按照特定轨迹遍历字符串图
- SQL 按照特定字符分割字符串
- 按照特定符号分割字符串为数组
- fastJson按照字符串顺序遍历JSON字段
- JS把字符串按照特定的字母顺序进行排序
- 按照特定分割符进行字符串的分割
- iOS NSString字符串按照特定字符分割成数组
- TreeMap的使用,实现按照特定方式排序,并且使用Iterator遍历
- Shell 脚本 遍历文件 找出包含特定字符串的行数
- 字符串按照特定字符进行分割是编程时候经常要用到方法
- Matlab按照特定形式拼接保存字符串数组范例(附源代码)
- mysql 按照特定顺序排序
- poj 2192 DP 2个字符串 按照原来的先后顺序 看能否组成特定的字符串
- sql按照特定的字段排序
- mysql orderby 按照特定值排序
- Oracle将以特定分隔的字符串转成表格的方法(用于类似游标的遍历)
- 让精灵按照自己设定的轨迹运动
- 按照字符串长度排序
- java TCP/UDP编程
- 深度学习(卷积神经网络)一些问题总结
- C++ 内存对齐
- 安装ssh
- 任意两点之间的最短路径问题(Floyd-Warshall算法)
- 按照特定轨迹遍历字符串图
- Android添加第三方so到APK中
- 常用的命令、小技巧
- ScrollView反弹效果的实现
- 大道至简-小波
- 【bzoj1193】[HNOI2006]马步距离
- hdu 1102 Constructing Roads
- xcode 常用的快捷键
- 怎么去掉Xcode工程中的某种类型的警告