[leetcode]ZigZag Conversion

水题。主要就是画画图,找找规律。稍微要注意的是:1. nRow为1的情况;2. 采用变量index方便边界判断

public class Solution {
    public String convert(String s, int nRows) {
        StringBuilder sb = new StringBuilder();
        if (nRows == 1) return s;
        // nRows >= 2
        for (int i = 0; i * (2 * nRows - 2) < s.length(); i++)
        {
            sb.append(s.charAt(i * (2 * nRows - 2)));
        }
        
        for (int i = 1; i < nRows - 1; i++)
        {
        	for (int j = 0;; j++)
            {
        		int index = j * (2 * nRows - 2) - i;
        		if ( index > 0 && index < s.length())
        		{
        			sb.append(s.charAt(index));
        		}
        		index = j * (2 * nRows - 2) + i;
        		if ( index > 0 && index < s.length())
        		{
        			sb.append(s.charAt(index));
        		}
        		else
        		{
        			break;
        		}
            }
        }
        
        // last
        if (nRows != 0 && nRows != 1)
        {
	        for (int i = 0; i * (2 * nRows - 2) + nRows - 1 < s.length(); i++)
	        {
	        	sb.append(s.charAt(i * (2 * nRows - 2) + nRows - 1));
	        }
        }
        
        return sb.toString();
    }
}

第二刷,先找规律,写公式,然后写代码,要注意行数为1的情况:

class Solution {
public:
    string convert(string s, int nRows) {
        if (nRows == 1) return s;
        string res;
        int inc = (nRows - 1) * 2;
        for (int i = 0; i < nRows; i++)
        {
            for (int j = i; j < s.length(); j += inc)
            {
                res.push_back(s[j]);
                if (i == 0 || i == nRows - 1)
                    continue;
                if (j + inc - i * 2 < s.length())
                    res.push_back(s[j + inc - i * 2]);
                    
            }
        }
        return res;
    }
};

  

原文地址:https://www.cnblogs.com/lautsie/p/3197073.html