一道算法题涉及很多东西;其实自己语法也不熟悉,或许用vector 会省去很多不必要的麻烦。
首先涉及到的是char与string 转化的问题
1、string 当作char 用的话就是直接可以用下标
for(int i =0,x = 0,y = 0;i<len;i++){
if(i%(2*r-2)<(r-1)){
arr[x++][y] = s[i];
}else{
arr[x--][y++] = s[i];
}
}
string res;
for(int i = 0;i<r;i++){
for(int j = 0;j<l;j++){
if(arr[i][j] !=' '){
res +=arr[i][j];
//temp[cnt++] = arr[i][j];
//cout<<"test1"<<endl;
cout<<arr[i][j];
}else {
cout<<" ";
}
}cout<<endl;
}
2、把char 转化成string 的话 可以直接 str += arr[i][j];
算法问题 采用最简单的二维数组模拟 这样子会消耗大量的空间但是思路很清楚
for(int i =0,x = 0,y = 0;i<len;i++){
if(i%(2*r-2)<(r-1)){
arr[x++][y] = s[i];
}else{
arr[x--][y++] = s[i];
}
}
其他细节
1、计算 l 的时候 由于 int 的特性 ,可以选择将分子加一个周期
int l = (len + t-1)/t *(r - 1);
其他遇到的问题的话,还有下标超出的问题,挺令人头疼的,多看书学习吧。
2、二维字符数组初始化一下, 便于后期判断
for(int i =0;i<r;i++){
for(int j = 0;j<l;j++){
arr[i][j] = ' ';
}
}
3、动态内存分配问题:由于leetcode 不能直接将char转化为string 可以考虑以下方法
string str;
char ch = 'a';
str +=ch;
4、超时问题
把循环中的多余语句删掉就可以了
所有代码
class Solution {
public:
string convert(string s, int numRows) {
int len = s.length();
char temp[len];
int r = numRows;//行数
if(r==1||len<=r){
return s;
}
//int l = (len/(2*r-2))*(r-1) + 50;
//int l = 100;
//cout<<"l = "<<l<<endl;
int t = 2*r - 2;
int l = (len + t-1)/t *(r - 1);
char arr[r][l];
for(int i =0;i<r;i++){
for(int j = 0;j<l;j++){
arr[i][j] = ' ';
}
}
int k = 0;int x = 0;int y = 0;
// while(k<len){
// //通过模的方法,此可学习
// if(k%(2*r-2)<(r-1)){
// arr[x++][y] = s[k++];
// } else{
// arr[x--][y++] = s[k++];
// }
// //cout<<"test"<<endl;
// }
for(int i =0,x = 0,y = 0;i<len;i++){
if(i%(2*r-2)<(r-1)){
arr[x++][y] = s[i];
}else{
arr[x--][y++] = s[i];
}
}
int cnt = 0;
string res;
for(int i = 0;i<r;i++){
for(int j = 0;j<l;j++){
if(arr[i][j] !=' '){
res +=arr[i][j];
//temp[cnt++] = arr[i][j];
//cout<<"test1"<<endl;
cout<<arr[i][j];
}else {
cout<<" ";
}
}cout<<endl;
}
return res;
}
};