题目内容:

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

P   A   H   N
A P L S I I G
Y I R
之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR" 实现一个将字符串进行指定行数变换的函数: string convert(string s, int numRows);
示例 1: 输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"
示例 2: 输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"

  

思路:

找规律的题目,字符串各字母内容不管,找下标的规律,拿上面的第二个样例为例子,下标排列是这样子的

 /*
* 0 6 12
* 1 5 7 11 13
* 2 4 8 10 14
* 3 9
* */

  

可以看出,除去斜边的,每一行都是一个等差数列,例如0,6,12

而斜边的是竖排中的数加上某一个固定值,例如第二行就是1+4=5,7+4=11

然后综合可以总结出规律,等差数列的差是numRows+numRows-2,即2*numRows-2,其实就是同一行相邻数字中隔的数字

然后每一行中间要加的固定值,是前面等差数列的差依次-2,因为每向下一行两个数间隔就少两个数,例如第二行固定值4,第三行固定值就是4-2=2

之后就是用代码实现了,相信也不难写了

if(numRows>s.length()||numRows==1)
return s;
int length = s.length();
int count = numRows*2-2;
int next = 0;
String result = "";
for(int i = 0;i < numRows;i++){
for(int j = i;j < length;){
result = result + s.charAt(j);
next = j + count - 2 * i;
if(i!=0&&i!=numRows-1&&next<length){
//第一行和最后一行竖排中的数加上固定值和这个数字在等差数列的下一个值相等
//所以这两行不管它
result = result + s.charAt(next);
}
j = j + count;
}
}
return result;

  

这个还不是最优解,到时候看看还能不能优化

最新文章

  1. 【好文要转】HTTP图解(大牛必经之路)
  2. lamp环境搭建(ubuntu)
  3. shell编程中的select用法
  4. OC中NSDictionary(字典)、NSMutableDictionary(可变字典)、NSSet(集合)、NSMutableSet(可变集合)得常用方法
  5. hdu 2711&amp;&amp;poj2182 Lost Cows (线段树)
  6. input(file)浏览按钮美化 (巨简单),网上那些都弱爆了
  7. python : 批量下载R语言库包
  8. java平台的常用资源
  9. php设计模式(二):结构模式
  10. 基于回调的事件处理——重写onTouchEvent方法响应触摸屏事件
  11. MySQL索引篇
  12. 将控制台信息显示在前台页面的js插件
  13. 关于React Native项目在android上UI性能调试实践
  14. 如何热更新线上的Java服务器代码
  15. python数据类型知识整理
  16. gdb调试线程
  17. HTML的lang属性的作用
  18. 算法提高 P0102
  19. Dubbox服务demo
  20. Struts2 JSONObject的使用

热门文章

  1. 2019.02.07 bzoj4316: 小C的独立集(仙人掌+树形dp)
  2. 2018.10.31 NOIP训练 锻造(方程式期望入门题)(期望dp)
  3. 2018.10.31 bzoj3339&&3585mex(主席树)
  4. 假期训练五(poj-1077bfs+康拓展开,hdu-2577dp)
  5. Latex插图操作
  6. Spring Boot项目Maven Build报错的解决方法
  7. excel2007自定义菜单项学习
  8. BitMap的简单实现
  9. POJ 3110 Jenny&#39;s First Exam (贪心)
  10. LINQ 语法