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

6.Zigzag Z 字形变换

时间:2019-07-08 10:39:52      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:value   har   amp   读数   image   package   tostring   stringbu   用例   

技术图片

class Solution {
    public String convert(String s, int numRows) {
        //null check
        if(null==s){
            return null;
        }
        if(null!=s &&(s.length()<=1||numRows==1) ){
            return s;
        }
        //calc collumn size we need
        int len=s.length();
        int innerSize=numRows-2;
        int group=(len/(numRows+innerSize));
        int colNums=group+(len-numRows*group);
        char[][] out=new char[numRows][colNums];
        //set value for 2d Array
        int tmpCol=0;
        int tmpRow=0;
        for (int i=0; i<len;i++){
            char tmp=s.charAt(i);
            int index= i%(numRows+innerSize);
            if(index==0){
                tmpRow=0;
            }
            if((i>0&&index==0 )||(index>numRows-1)){
                tmpCol++;
            }
            out[tmpRow][tmpCol]=tmp;
 
            if(index<numRows-1){
                tmpRow++;
            }else{
                tmpRow--;
            }
        }
        StringBuilder stringBuilder=new StringBuilder();
        for (int i=0;i<numRows;i++){
            for (int j=0;j<colNums;j++){
                char c=out[i][j];
                if((int)c!=0){
                    stringBuilder.append(c);
                }
            }
        }
        return  stringBuilder.toString(); 
    }
}

本人先讲自己比较笨的 方法

package homework;
public class Main {
    public String convert(String s, int numRows) {
        int length = s.length(), x = 0, y = 0;
        String arr[][] = new String[numRows][20];
        int i = 0;
        if(numRows==1) {//这个部分是自己后面加上去的 因为numRow==1的话 else部分不适合 
            return s;
        }
        else {  //方法的话 是采用 二维数组进行存放
        while (i < length) {
            arr[x][y] = String.valueOf(s.charAt(i));//先第一步处理竖
            // System.out.print(s.charAt(i)+" ");//查看每一步处理的字符串
            // System.out.println(arr[x][y]);
            i++;
            x++;
            if (x == numRows - 1) {//竖处理完之后 跳入这个循环 处理斜的 处理完斜行后跳出来
                while (x != 0 && i < length) {
                    arr[x][y] = String.valueOf(s.charAt(i));
                    // System.out.print(s.charAt(i)+" ");
                    // System.out.println(arr[x][y]);
                    x--;
                    y++;
                    i++;
                }
            }
        }
        }
        String str = "";//这个没什么好说的就读数据
        for (int i2 = 0; i2 < numRows; i2++) {
            for (int x2 = 0; x2 < 20; x2++) {
                if (arr[i2][x2] != null && arr[i2][x2] != "")
                    str = str + arr[i2][x2];
            }
        }
        return str;
    }
    public static void main(String[] args) {//测试用例
         Main m = new Main();
        String s = "AB";
        int numRows = 1;
        System.out.println(m.convert(s, numRows));
    }
}

技术图片
技术图片

class Solution {
    public String convert(String s, int numRows) {
        //如果是有一行,可以直接返回
        if (numRows == 1) {
            return s;
        }
        StringBuilder result = new StringBuilder();
        //运用数学规律,逐行取值
        for (int i = 0; i < numRows; i++) {
            int j = 0;//表示第i行的第j个数
            while (j + i < s.length()) {
                result.append(s.charAt(j + i));//j每次循环时,首先取j+i坐标上的字母
                //如果不是第一排或者最后一排,一般情况下,每两个竖排间会有两个字母,第二个字母的规律是j+numRows * 2 - 2 - i
                if (i != 0 && i != numRows - 1 && j + numRows * 2 - 2 - i < s.length()) {
                    result.append(s.charAt(j + numRows * 2 - 2 - i));
                }
                //第一竖排和第二竖排的坐标差值为numRows * 2 - 2
                j += numRows * 2 - 2;
            }
        }
        return result.toString();
    }
}

6.Zigzag Z 字形变换

标签:value   har   amp   读数   image   package   tostring   stringbu   用例   

原文地址:https://www.cnblogs.com/cznczai/p/11149647.html

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