首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Z字形形式转换

2013-11-19 
Z字形模式转换?题目:有一个字符串?PAYPALISHIRING,它将使用Z字形模式转换成如下的方式:?PAHNA P L S I I

Z字形模式转换

?题目:有一个字符串?"PAYPALISHIRING",它将使用Z字形模式转换成如下的方式:

?

P   A   H   NA P L S I I GY   I   R

一行一行读,"PAHNAPLSIIGYIR"

请写出一个函数,它的输入参数有两个,一个是需要转化的字符串s,一个是行数n,

string convert(string text, int nRows);

输入("PAYPALISHIRING", 3)?应该返回?"PAHNAPLSIIGYIR".

这个需要考虑的是使用二维数组来保存这个字符串,先是用列去保存,然后一行一行的读,就是题目的要求。

问题是如何确定数组的列数了?

?

其实,我们能够发现规律,我们知道了行数,也就是第一列能保存为n(输入参数决定),第二列是1个,一共n-2个列数是输入一个的,然后又是输入n,所以前n-1个作为一个单元,能输入n+n-2个字符,所以

?

需要列数为s的字符总长度,除以n+n-2,得到需要多少单元,一个单元是n-1列

?

总共需要为?s.length()*(nRows-1)/(nRows+nRows-2)+1;后面的1保证如果不能整除n+n-2,后面的字符需要多处一个单元存储。

?

按照规律存放数据,然后按照行读取,代码不解释

?

public class Solution {    public String convert(String s, int nRows) {if(nRows==1)return s;int length=s.length()*(nRows-1)/(nRows+nRows-2)+1;if(length==0)length++;char conver[][]=new char[nRows][length];char []temp=s.toCharArray();int j=0;int k=0; boolean flag=true;while(k<temp.length){ if(flag){   for(int i=0;i<nRows;i++){  if(k>=temp.length)  break;  conver[i][j]=temp[k];  k++;   }   j++;   flag=false;   } else { for(int i=nRows-2;i>0;i--){ if(k>=temp.length) break;conver[i][j]=temp[k];j++;k++; } flag=true; }}StringBuffer outcome=new StringBuffer();for(int i=0;i<conver.length;i++){for(int column=0;column<conver[i].length;column++){if(conver[i][column]!=(char)0)outcome.append(conver[i][column]);}}return outcome.toString();}}

?

?

?

热点排行