码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode_ZigZag Conversion

时间:2015-02-08 11:41:09      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

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

Leetcode_ZigZag Conversion

标签:

原文地址:http://blog.csdn.net/yinqiaohua/article/details/43635325

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!