leetcode算法每天一题006
题目描述
-
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行N 字形排列,输出正常顺序的结果。
-
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
暴力解法(用二维向量存储重排的结果,然后正序读取出来)
c++
class Solution {
public:
string convert(string s, int numRows) {
int column = 7000;
const int n = numRows;
string res;
vector< vector<char> > asd1(numRows, vector<char>(column, 0)); //初始化row*column二维动态数组,初始化值为0
if(n==1){
return s;
}
if(n==2){
for(int i=0;i<s.size();i++){
if(i%2==0){
asd1[0][i/2]=s[i];
}else{
asd1[1][i/2 + 1 ] = s[i];
}
}
}
if(n>2){
for(int i=0;i<s.size();i++){
if(i%(2*n-2)<n){
asd1[i%(2*n-2)][(i/(2*n-2))*(n-1)]=s[i];
}else{
asd1[((n-1)-((i%(2*n-2))-n ))-1][(i/(2*n-2))*(n-1) + (i%(2*n-2))-n+1 ] = s[i];
}//((i%(2*n-2))-n ) 是在[n,n-1]的n-2个元素中的排序
}
}
for(int tn=0;tn<numRows;tn++){
for(int m=0;m<7000;m++){
if(asd1[tn][m]!= 0){
res.push_back(asd1[tn][m]);
}
}
}
return res;
}
};
class Solution {
public:
string convert(string s, int numRows) {
int column = 0;
const int n = numRows;
string res="";
vector< vector<char> > asd1(numRows, vector<char>(column, 0)); //初始化row*column二维动态数组,初始化值为0
int flag = 0;
for(int i=0,row=0;i<s.size();i++){
asd1[row].push_back(s[i]);
if( row == 0 || row == numRows-1 ) flag = !flag;
row += flag ? 1:-1;
}
for(int tn=0;tn<numRows;tn++){
for(int m=0;m<asd1[tn].size();m++){
res.push_back(asd1[tn][m]);
}
}
return res;
}
};
c++(动态数组直接存储)
class Solution {
public:
string convert(string s, int numRows) {
int column = 0;
const int n = numRows;
string res="";
if(numRows==1) return s;
vector< vector<char> > asd1(numRows, vector<char>(column, 0)); //初始化row*column二维动态数组,初始化值为0
int flag = 0;
for(int i=0,row=0;i<s.size();i++){
asd1[row].push_back(s[i]);
if( row == 0 || row == numRows-1 ) flag = !flag;
row += flag ? 1:-1;
}
for(int tn=0;tn<numRows;tn++){
for(int m=0;m<asd1[tn].size();m++){
res.push_back(asd1[tn][m]);
}
}
return res;
}
};
java java中的动态数组ArrayList
class Solution {
public String convert(String s, int numRows) {
int column = 0;
int n = numRows;
if(numRows==1) return s;//特殊情况
StringBuilder[] stringLine = new StringBuilder[numRows];
for (int i = 0; i < stringLine.length; i++) {
stringLine[i] = new StringBuilder();
}
boolean flag = false;
for(int i=0,row=0;i<s.length();i++){
stringLine[row].append(s.charAt(i));
if( row == 0 || row == numRows-1 ) {
flag = (!flag);
}
row += flag ? 1:-1;
}
StringBuilder res = new StringBuilder();
for (int i = 0; i < stringLine.length; i++) {
res.append(stringLine[i]);
}
return res.toString();
}
};
其他方法
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。