【leetcode c++】ZigZag Conversion

题目原文

 

The string "PAYPALISHIRING" iswritten in a zigzag pattern on a given number of rows like this: (you may wantto 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 andmake this conversion given a number of rows:

 

string convert(string text, int nRows);

convert("PAYPALISHIRING", 3)should return "PAHNAPLSIIGYIR".

 

很遗憾本人没有读懂题目,而是通过别人的博客了解的题目的要求的,上链接

http://blog.csdn.net/zhouworld16/article/details/14121477

另外这位博主是通过寻找下标规律来重组字符串的。

 

介绍一下所谓的zigzag(锯齿状)。

首先,把原始字符串这么摆:


没错,是这么摆。

接下来画n条直线与之相交:我们这里画4条


相交之后就会产生交点:输入字符串的字符就排列在这些交点上啦。


这些交点重组之后的n个字符串接起来就是题目要求的输出了


也就是resString =string_1 + string_2 + string_3 + string_4;

/

当n=1的时候,输入等于输出。

当n=2的时候,输出就是下标为偶数和下标为奇数的两个重组的字符串接起来。

 

依据上述的思路的解法就是,创建一个存有n个string的数组,用一个迭代器获取数组中的字符串。


获取第1个交点,把它加到string_1中,迭代器后移,指向string_2。

获取第2个交点,把它加到string_2中,迭代器后移,指向string_3。

……

迭代器到达边缘时转向,直到扫描完所有交点(输入字符串)。

 

Leetcode的Accepted Solutions Runtime Distribution(截于5月上旬,灰色柱子是所处)

 

这里因为使用数组和迭代器,所以相比于利用规律来重组字符串的速度要慢一些。关于利用规律的解法请参照开头提供的链接。

源码:(VS2013)如果需要提交leetcode只需要把convertZigZag函数中的代码复制过去即可。

 

#include <iostream>
#include <map>
#include <vector>
#include <string>

using namespace std;

string convertZigZag(string s, int numRows);

int main()
{
	string s1 = "PAYPALISHIRING";

	cout << convertZigZag(s1, 3);

	return 0;
}


string convertZigZag(string s, int numRows) {
	if (1 == numRows)
	{
		return s;
	}
	if (2 == numRows)
	{
		string::iterator iter;
		iter = s.begin();
		string s1;
		string s2;
		while (iter != s.end())
		{
			s1 += *iter;
			iter++;
			if (iter != s.end())
			{
				s2 += *iter;
				iter++;
			}
		}

		return s1 + s2;
	}

	else
	{
		vector<string> sRes;
		vector<string>::iterator iterSRes;
		string::iterator iterS;

		for (int i = 0; i < numRows; i++)
		{
			string s2;
			sRes.push_back(s2);
		}
		int max = s.size();
		bool down = false;

		int count = 0;
		iterSRes = sRes.begin();
		iterS = s.begin();

		while (count < max)
		{
			if (0 == count % (numRows - 1))
			{
				if (down) down = false;
				else down = true;
			}

			*iterSRes += *iterS;

			if (down) 
			{
				iterSRes++;

			}
			else 
			{
				iterSRes--;

			}
			iterS++;
			count++;
		}
		string res;
		iterSRes = sRes.begin();
		while (iterSRes != sRes.end())
		{
			res += *iterSRes;
			iterSRes++;
		}
		return res;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值