题目描述
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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 不会。
---------------------

6——Z 字形变换(ZigZag Conversion)的更多相关文章

  1. [Swift]LeetCode6. Z字形变换 | ZigZag Conversion

    The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like ...

  2. C#版[击败100.00%的提交] - Leetcode 6. Z字形变换 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  3. Z 字形变换 C++实现 java实现 leetcode系列(六)

    Z 字形变换  java实现 C++实现  将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 ...

  4. Leetcode题库——6.Z字形变换

    @author: ZZQ @software: PyCharm @file: convert.py @time: 2018/9/20 20:12 要求: Z字形变换 将字符串 "PAYPAL ...

  5. LeetCode Golang 6. Z 字形变换

    6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...

  6. Leetcode(6)Z字形变换

    Leetcode(6)Z字形变换 [题目表述]: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...

  7. Java实现 LeetCode 6 Z字形变换

    6. Z 字形变换 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L ...

  8. 【LeetCode】6. ZigZag Conversion Z 字形变换

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:字形变换,ZigZag,题解,Leetcode, 力扣,P ...

  9. 【LeetCode】ZigZag Conversion(Z 字形变换)

    这道题是LeetCode里的第6道题. 题目要求: 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" ...

随机推荐

  1. mysql-sql语句中变量的使用

    最近工作中用到mysql,发现mysql和Oracle差别挺大的,其不像Oracle中存在丰富的分析函数(开窗函数),如rank(),lag(),leaf()等,只能用变量来获取以便达到分析函数的效果 ...

  2. CODEVS1533 Fibonacci数列 (矩阵乘法)

    嗯,,,矩阵乘法最基础的题了. Program CODEVS1250; ..,..] of longint; var T,n,mo:longint; a,b:arr; operator *(a,b:a ...

  3. [bzoj2226][Spoj5971]LCMSum_欧拉函数_线性筛

    LCMSum bzoj-2226 Spoj-5971 题目大意:求$\sum\limits_{i=1}^nlcm(i,n)$ 注释:$1\le n\le 10^6$,$1\le cases \le 3 ...

  4. [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列

    理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...

  5. spring历史背景

    1.2004年spring出现第一版本spring frameworl1.0 2.写代码永远是最简单的,后续的运维工作才是让人感到无助的 3.spring boot在运维方面做了很多工作,部署,监控, ...

  6. 极光推送案例-PushExample-Jpush

    ssh - maven - java项目-极光注冊id完毕推送 这是我学习时的步骤: 1:去极光推送平台注冊账号,自己能够去注冊(一般公司会帮助完毕注冊) 地址:https://www.jpush.c ...

  7. C++ 句柄类的原理以及设计

    句柄类存在的意义是为了弥补将派生类对象赋给基类对象时发生的切片效应.比如以下的程序: multimap<Base> basket; Base base; Derived derive; b ...

  8. luogu1522 牛的旅行

    题目大意 每个牧场里的某些坐标位置有牧区,牧区间有一个个路径(长度为位置间的直线距离).一个连通块内两个节点间的最短路径长度最大值为它的直径.请编程找出一条连接两个不同牧场的路径,使得连上这条路径后, ...

  9. git 拉取和获取 pull 和 fetch 区别【转】

    本文转载自:http://blog.csdn.net/u010094934/article/details/52775653 使用git  直接提交的话   直接 push 获取最新版本  有两种   ...

  10. 【BZOJ 1598】 牛跑步

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1598 [算法] A*求k短路 [代码] #include<bits/stdc+ ...