Leetcode_ZigZag Conversion

ZigZag Conversion

(图片来自http://www.cnblogs.com/sanghai/p/3632528.html)
向下循环:nRows

斜角线循环:nRows-2(减去首尾两个端点)

定义一列和一斜对角线的循环长度为dLen=nRows+nRows-2;

1 第一行和最后一行,均是由第一列加上dLen的倍数,即可

2 其余行,每计算出下一列的下标j之后,再判断j+dLen-2*i是否还在s的长度范围内。其中,i代表所在的行,j为s中的下标。(如第二行,第一列j=1,第二行的第二个元素为下标7=1+dLen-2*1)。

#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
    string convert(string s, int nRows) {
		if(nRows==1)
			return s;
		int dLen=nRows+nRows-2;
		int len=s.size();
		string result;
		for(int i=0;i<nRows;++i)
		{
			int j=i;
			if(j==0||j==nRows-1)//将第一行和最后一行单独提出来
			{
				while(j<len)
				{
					result+=s[j];
					j=j+dLen;
				}
			}
			else//其余行
			{
				while(j<len)
				{
					result+=s[j];
					if(j+dLen-2*i<len)//每一行的第偶数个元素下标
					{
						result+=s[j+dLen-2*i];
					}
					j=j+dLen;
				}
			}

		}
		return result;
        
    }
};
int main()
{
	string s;
	int n;
	cin>>s>>n;
	Solution S;
	cout<<S.convert(s,n);
	return 0;
}

网上的代码:

string convert(string s, int nRows){
    if(nRows == 1) return s;
    string res[nRows];
    int i = 0, j, gap = nRows-2;
    while(i < s.size()){
        for(j = 0; i < s.size() && j < nRows; ++j) res[j] += s[i++];
        for(j = gap; i < s.size() && j > 0; --j) res[j] += s[i++];
    }
    string str = "";
    for(i = 0; i < nRows; ++i)
        str += res[i];
    return str;
}
http://www.cnblogs.com/sanghai/p/3632528.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值