leetcode——z字形变换

题目:

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:(下面这样的形状)

P   A   H   N                    //0号数组
A P L S I I G                    //1号数组
Y   I   R                        //2号数组

之后按逐行顺序依次排列:"PAHNAPLSIIGYIR"

 

实现一个将字符串进行指定行数的转换的函数:

string convert(string text, int nRows);

convert("PAYPALISHIRING", 3) 应当返回 "PAHNAPLSIIGYIR" 。

我的分析:

可以看出,在排列好的图形中,照着z字形读取的话就是字符串的原顺序,于是我们逆向思维考虑,多少行我就用多少个的数组保存,假设有4行,那么原字符串照顺序添加到数组就是

0123210123210123…….

(这里的数字表示的是保存的数组的编号)

之后我们只要照数组的顺序(0 1 2 3)读取里面的字符即可


代码:

public String convert(String s, int numRows) {

     	if(numRows==1)
     		return s;

     	List<Character>[] list=new List[numRows];        //多少行就创建多少个数组
     	for(int i=0;i<numRows;i++){
     		list[i]=new ArrayList<>();
	}
	int temp=0;
     	int temp2=0;
     	int flag=0;
     	while(temp<s.length()){
     	        while(temp<s.length()&&flag!=numRows){
     		        list[flag++].add(s.charAt(temp++));
		}
		flag=numRows-2;
		while(temp<s.length()&&flag!=-1){
			list[flag--].add(s.charAt(temp++));
		}
		flag=1;
	}
	char[] result=new char[s.length()];
     	while(temp2<s.length()){                          //按照数组的顺序读取字符,加入到字符数组
     		for(int k=0;k<numRows;k++){
			Iterator iterator=list[k].iterator();
			while(iterator.hasNext()){
				result[temp2++]=(char)iterator.next();
			}
		}
	}
	String resultstring=new String(result);            //把字符数组变成字符串   
     	return resultstring;
}

可以参考一下别人的,好像比我的简洁很多。。。

LeetCode6Z字形转换



点赞