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

[LeetCode]ZigZag Conversion

时间:2014-05-15 04:49:04      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:style   blog   class   code   c   ext   

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

P   A   H   N
A P L S I I G
Y   I   R
And then read line by line: "PAHNAPLSIIGYIR"

Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows);
convert("PAYPALISHIRING", 3) should return "PAHNAPLSIIGYIR".

class Solution {
public:
    string convert(string s, int nRows) {
    if(s.size() <= 1 || nRows == 1)
    {
        return s;
    }
    
    int totalCol = (s.size() + 2 * nRows - 1)/(2 * nRows - 2) * (nRows - 1);
	char **rct = new char* [nRows];
	//std::vector< std::vector<char> > rct;
	for (int i = 0; i < nRows; i++)
	{
		rct[i] = new char[totalCol];
		for (int j = 0; j < totalCol; j++)
		{
			rct[i][j] = ‘ ‘;
		}
	}
	
	//char rct[10][10];
	int col = 0;
	for (int i = 0; i < s.size(); i++)
	{
		/*int col = i / (2 * nRows - 2);*/
		if (i % (2 * nRows - 2) == 0 )
		{
			int R = 0;
			while(i < s.size() && R < nRows)
			{
				//第col列先赋值
				rct[R][col] = s[i];
				R++;
				i = i++;
				//对第col++列赋值
				if (R == nRows - 1)
				{
					while(R > 0 && i < s.size())
					{	
						rct[R][col] = s[i];
						i = i++;
						R--;
						col++;
					}
				}
				//R又回到0,跳出
				if (R == 0)
				{
					i--;
					break;
				}
			}
		}
	}
	std::string ans;
	for (int i = 0; i < nRows; i++)
	{
		for (int j = 0; j < totalCol; j++)
		{
			if (rct[i][j] != ‘ ‘)
			{
				ans += rct[i][j];
			}
		}
	}
	for (int i = 0; i < nRows; i++)
	{
		delete[] rct[i];
		rct[i] = NULL;
	}
	delete[] rct;
	rct = NULL;
	return ans;
        
    }
};

网上看到的简洁代码:

题意的 "z" 字形指一列nRows个,然后斜着往右上一格一个回到第一行,然后再一列nRows个。比如nRows=5,如下:

1       9       17       25    
2     8 10     16 18     24 26    
3   7   11   15   19   23   27  
4 6     12 14     20 22     28 30  
5       13       21       29    

每行字母在原字符串中的间隔是有规律的,虽然两层for循环,但是s中每个字母只访问了一次,O(n)。

class Solution {
public:
    string convert(string s, int nRows) {
        if(nRows == 1) return s;
        string ans;
        int a = (nRows << 1) - 2, b = 0;
        for(int i = 0; i < nRows; i ++, a -= 2, b += 2)
        {
            bool flag = false;
            for(int j = i; j < s.length(); 
                    j += flag ? (b ? b : a) : (a ? a : b), flag ^= 1)
                ans += s[j];
        }
        return ans;
    }
};



[LeetCode]ZigZag Conversion,布布扣,bubuko.com

[LeetCode]ZigZag Conversion

标签:style   blog   class   code   c   ext   

原文地址:http://blog.csdn.net/jet_yingjia/article/details/25717025

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