[LeetCode]N字形变换 C++

一道算法题涉及很多东西;其实自己语法也不熟悉,或许用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; 
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值