LeetCode # ZigZag Conversion #






我的Python解答:


"""
Programmer  :   EOF
Date        :   2015.04.14
File        :   zigzag.py
E-mail      :   [email protected]

"""

class Solution:
    def convert(self, s, nRows):
        length = len(s)
        ret_string = ""
        i   = 0
        row = 0 
        counter = 0
        if nRows != 1:
            while row < nRows:
                i = row
                col = 0
                while i < length and counter < length:
                    ret_string += s[i]

                    if row == 0 or row == nRows -1:
                        i += (nRows - 1)*2
                    elif col % 2 == 0:
                        i += (nRows - row -1)*2
                    else:
                        i += row*2
                    col     += 1
                    counter += 1
                row += 1
        else:
            return s

        return ret_string
#----------- just for testing ----------

s = Solution()
print s.convert("AB", 2)
print s.convert("PAYPALISHIRING", 3)
print s.convert("PAYPALISHIRING", 4)


凱旋衝鋒的Java解答:


package zigzag_conversion;

public class Solution {
	/*
	0    [         totalGap           ]       6                                         c
	1    [  totalGap-2row  ]    5   [ 2row ]  7                           b             d
	2             4                           8             a                           e
	3                                         9                                         f
	*/
	public String convert(String s, int nRows) {
		if (nRows == 1) {
			return s;
		}
		int len = s.length();
		StringBuilder builder = new StringBuilder(len);
		int totalGap = (nRows - 1) << 1;
		for (int i = 0; i < len; i += totalGap) {
			builder.append(s.charAt(i));
		}
		for (int row = 1; row < nRows - 1; row++) {
			for (int i = row, gap = row << 1; i < len; gap = totalGap - gap, i += gap) {
				builder.append(s.charAt(i));
			}
		}
		for (int i = nRows - 1; i < len; i += totalGap) {
			builder.append(s.charAt(i));
		}
		return builder.toString();
	}

	public static void main(String[] args) {
		System.out.println(new Solution().convert("ABCD", 4));
	}
}


皓神的C++解答:


// Source : https://oj.leetcode.com/problems/zigzag-conversion/
// Author : Hao Chen
// Date   : 2014-07-17

/********************************************************************************** 
* 
* 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".
* 
*               
**********************************************************************************/

#include <iostream>
#include <vector>
#include <string>
using namespace std;

string convert(string s, int nRows) {
    //The cases no need to do anything
    if (nRows<=1 || nRows>=s.size()) return s;
     
    vector<string> r(nRows);
    int row = 0;
    int step = 1;
    for(int i=0; i<s.size(); i ++) {
        if (row == nRows-1) step = -1;
        if (row == 0) step = 1;
        //cout << row <<endl;
        r[row] += s[i];
        row += step;
    }
    
    string result;
    for (int i=0; i<nRows; i++){
        result += r[i];
    }
    return result;
}

int main(int argc, char**argv){

    string s;
    int r;

    s = "PAYPALISHIRING";
    r = 3;
    cout << s << " : " << convert(s, 3) << endl;

}









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章