zoukankan      html  css  js  c++  java
  • 6——Z 字形变换(ZigZag Conversion)

    题目描述
    将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。

    比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:

    L C I R
    E T O E S I I G
    E D H N
    1
    2
    3
    之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。

    请你实现这个将字符串进行指定行数变换的函数:

    string convert(string s, int numRows);
    1
    示例1
    输入: s = "LEETCODEISHIRING", numRows = 3
    输出: "LCIRETOESIIGEDHN"
    1
    2
    示例2
    输入: s = "LEETCODEISHIRING", numRows = 4
    输出: "LDREOEIIECIHNTSG"
    解释:

    L D R
    E O E I I
    E C I H N
    T S G
    1
    2
    3
    4
    5
    6
    7
    8
    例题解法:
    因为我自己写的将近 100 行代码,实在不能看,所以就去看了解析,下面是解析的解法。
    由题我们可知一般情况下输出的行数就是传入的 numRows,而当传入的字符串字符数小于 numRows 时,行数即为该字符串所包含的字符数,所以直接用 n(行数)个 StringBuilder 来存储每行的字符,最后再将它们连接到一起即我们要输出的结果。(真是巧妙啊这个方法)
    尤其要注意当字符数少于需要输出的行数这种情况。

    class Solution {
    public String convert(String s, int numRows) {
    if (numRows == 1) {
    return s;
    }
    ArrayList<StringBuilder> arrs = new ArrayList<>();
    for (int i = 0; i < Math.min(numRows, s.length()); i++) {
    arrs.add(new StringBuilder());
    }
    boolean direction = true;
    int cur_row = 0;
    for (int i = 0; i < s.length(); i++) {
    arrs.get(cur_row).append(s.charAt(i));
    cur_row = cur_row + (direction ? 1 : -1);
    if (cur_row == 0 || cur_row == numRows - 1) direction = !direction;
    }
    StringBuilder result = new StringBuilder();
    for (int i = 0; i < arrs.size(); i++) {
    result.append(arrs.get(i));
    }
    return result.toString();
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    自己的憨憨解法
    是真的菜,还想先去计算了数组大小,然后再数组一个一个添加,实属憨憨写法,只有我自己能看懂。

    class Solution {
    public String convert(String s, int numRows) {
    int n = numRows;
    String result = "";
    int len = s.length();
    int column = 0;
    if (n == 1) {
    column = len;
    result += s;
    } else if (n == 2) {
    column = len/2 + len%2;
    for (int i=0, j=0; i < column; i++, j+=2) {
    result += s.charAt(j);
    }
    if (len%2 == 1) {
    for (int i=0, j=1; i < column-1; i++, j+=2) {
    result += s.charAt(j);
    }
    } else {
    for (int i=0, j=1; i < column; i++, j+=2) {
    result += s.charAt(j);
    }
    }
    } else {
    int length = len;
    boolean a = true;
    int l_str = 0, s_str = 0;
    while (length != 0) {
    if (a) {
    l_str++;
    if (l_str == n) {
    a = false;
    l_str = 0;
    column++;
    }
    } else {
    s_str++;
    if (s_str == (n-2)) {
    a = true;
    s_str = 0;
    }
    column++;
    }
    length--;
    }
    if (l_str>0 && l_str<n) {
    column++;
    }
    char[][] z = new char[n][column];
    for (int m = 0; m < n; m++) {
    for (int k =0; k < column; k++) {
    z[m][k] = 32;
    }
    }
    ArrayList<Character> arr = new ArrayList<>();
    for (int i = 0; i < len; i++) {
    arr.add(s.charAt(i));
    }

    int long_str_count = 0; //max is n
    int single_char_count = 0; //max is 3n-2
    boolean flag = true;
    int i = 0, j = 0;
    while (true) {
    if (flag) {
    z[i][j] = arr.get(0);
    arr.remove(0);
    long_str_count++;
    if (arr.isEmpty()) {
    break;
    }
    if (long_str_count==n) {
    flag = false;
    long_str_count = 0;
    i--;
    j++;
    } else {
    i++;
    }
    } else {
    z[i][j] = arr.get(http://www.my516.com);
    arr.remove(0);
    single_char_count++;
    if (arr.isEmpty()) {
    break;
    }
    if (single_char_count == (n-2)) {
    flag = true;
    single_char_count = 0;
    } else {
    }
    j++;
    i--;
    }
    }
    for (int m = 0; m < n; m++) {
    for (int k =0; k < column; k++) {
    if (z[m][k] != 32) {
    result += z[m][k];
    }
    }
    }
    }
    return result;
    }
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    获得知识
    StringBuilder 比 String 执行更快,因为使用 String 进行连接时,每次都会创建一个新的对象,而 StingBuilder 不会。
    --------------------- 

  • 相关阅读:
    jquery实现短信群发功能(机试题)
    PreparedStatement与Statement区别
    java中static关键字
    java笔试01
    java基础
    sqlserver errorcode
    改变分辨率会牵连到EMF图的大小
    基础知识——各种分辨率的知识 From http://vod.sjtu.edu.cn/help/Article_Show.asp?ArticleID=308
    本地存储
    Silverlight 3 MultiThreading编程http://blog.csdn.net/zjfei/archive/2009/07/27/4384428.aspx
  • 原文地址:https://www.cnblogs.com/ly570/p/11001438.html
Copyright © 2011-2022 走看看