电子商务网站建设 价格/快速优化seo
一、题目描述
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
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"
解释:
P I N
A L S I G
Y A H R
P I
示例 3:
输入:s = "A", numRows = 1
输出:"A"
提示:
1 <= s.length <= 1000
s 由英文字母(小写和大写)、',' 和 '.' 组成
1 <= numRows <= 1000
二、实现代码思路
class Solution {public String convert(String s, int numRows) {int len = s.length();if(s == null || (numRows <= 2 && len <=2)){return s;}int zuNum = numRows < 2 ? numRows : numRows + (numRows - 2);;// 一个组内有元素的个数int zuShu = (len % zuNum == 0) ? +len / zuNum : len / zuNum + 1;;// 字符串s可以分多少组String[] zuStr = new String[zuShu];//求二维数组列数int col = (len % zuNum == 0)? len/zuNum * (zuNum>1?1 + numRows - 2:1) : ((len / zuNum) * (1 + numRows - 2) + ((len % zuNum) > numRows ? (1 + len % zuNum % numRows) : 1));//二维数组 存放字符串字符char[][] charArray = new char[numRows][col];int temp = 0, k = 0;// 把字符串分组while (temp + zuNum <= len) {zuStr[k++] = s.substring(temp, temp + zuNum);temp += zuNum;}if (temp < len) {zuStr[k++] = s.substring(temp, len);}// 存放字符for (int i = 0; i < zuShu; i++) {int lenStr = zuStr[i].length();if (lenStr <= numRows) {for (int j = 0; j < lenStr; j++) {charArray[j][i * (zuNum - numRows + 1)] = zuStr[i].charAt(j);}} else {for (int j = 0; j < lenStr; j++) {if (j < numRows) {charArray[j][i * (zuNum - numRows + 1)] = zuStr[i].charAt(j);} else { charArray[numRows - (j + 2) % numRows][i * (zuNum - numRows + 1) + j + 1 - numRows] = zuStr[i].charAt(j); }}}}// 拼接字符StringBuilder sb = new StringBuilder();for (int i = 0; i < numRows; i++) {for (int j = 0; j < col; j++) {if (charArray[i][j] != 0) {sb.append(charArray[i][j]);}}}return sb.toString();}
}