leetcode 第六题 ZigZag Conversion

        从现在开始要一天一道leetcode了,不然感觉根本做不完的样子,说说最近做这几道题的感受吧,其实我真的是从小白开始做起的,刚开始的第一题都要看着答案做,然后慢慢地开始学会独立思考思考应该怎么解决问题,虽然还没有达到自己编写代码的能力,但是我已经开始学会独立思考了,这是我进步的地方,我希望通过算法的逐渐练习来提高我的编程能力。

        下面是第六题的解答:

        我在网上看题目分析的时候,发现了一个有意思的事情,就是数组的下标是一个很有用的东西,分析题目的时候可以用单纯的数字来模拟我需要打印字符的顺序。


        注意到除了第一行和最后一行之外,标号的间隔还有两种情况交替出现,这时就需要分奇数列和偶数列分别进行讨论。代码:

class Solution{
public:
    string convert(string s, int numRows){
		if(numRows < 2)
			return s;
		string ans = "";
		int len = s.size();
		int idx = 0;
		// Process the first line
		while(idx < len){
			ans = ans + s[idx];
			idx = idx + (numRows-1)*2;
		}
		// Process 2-numRows line
		for(int i = 1; i < numRows - 1; i++){
			//flag:Distinguish the odd and the even column
			bool flag = false;
			idx = i;
			if(idx >= len)
				break;
			ans += s[i];
			while(idx <= len){
				if(!flag){ //even column
					idx = idx + (numRows - i - 1)*2;
					if(idx < len)
						ans += s[idx];
					flag = true;
				}
				else{ //odd column
					idx = idx + i*2;
					if(idx < len)
						ans += s[idx];
					flag = false;
				}
			}
		}
		// Process the last line
		idx = numRows - 1;
		while(idx < len){
			ans = ans + s[idx];
			idx = idx + (numRows - 1)*2;
		}
		return ans;
	}
};
        坚持就是胜利!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值