[toc]
题目描述
给你一个字符串s。请你按照单词在 s 中的出现顺序将它们全部竖直返回。
单词应该以字符串列表的形式返回,必要时用空格补位,但输出尾部的空格需要删除(不允许尾随空格)。
每个单词只能放在一列上,每一列中也只能有一个单词。
输入:s = “HOW ARE YOU”
输出:[“HAY”,”ORO”,”WEU”]
解释:每个单词都应该竖直打印。
“HAY”
“ORO”
“WEU”
思路
1.自己的思路
首先以空格分割字符串,其次找出所有字符串里面最长的那个记录它的长度。因为maxLength最长的长度代表这需要遍历的次数,代表着list里面有多少个string。
所以我们遍历maxLength次,然后再在里面遍历每一个字符串,然后取出每一个字符串的第i个位置上的值,拼接起来。
如果当前字符串的长度小于或者等于遍历的次数i,则直接添加空格,最后遍历完之后要截取字符串,找到第一个非空字符进行截取。
代码实现
1.自己的代码实现
class Solution {public List<String> printVertically(String s) {//// 1. 分割出单词,找出最长的单词长度,给其他单词后边补上空格// 2. 循环给res数组中增加字母String[] words = s.split(" ");int maxLen = 0;// 找出最长的单词长度for(String word:words){maxLen = Math.max(maxLen,word.length());}// 填补空格for(int j=0;j<words.length;j++){int temp = maxLen-words[j].length();for(int i=0;i<temp;i++){words[j] += " ";}}// 进行结果输出String[] res = new String[maxLen];// List<Strign> res = new ArrayList<String>for(int i=0;i<res.length;i++){for(int j=0;j<words.length;j++){if(res[i] == null){res[i] = words[j].charAt(i)+"";}else res[i] += words[j].charAt(i);}}for(int i=0;i<res.length;i++){res[i] = "*" + res[i];res[i] = res[i].trim();res[i] = res[i].substring(1,res[i].length());}return Arrays.asList(res);}}
2.优秀的代码实现
class Solution {
public List<String> printVertically(String s) {
String[] split = s.split("\\ ");
List<String> list = new ArrayList<>();
int maxLength = 0;
for (String s1 : split) {
int tempLength = s1.length();
if(tempLength > maxLength) {
maxLength = tempLength;
}
}
for (int i = 0; i < maxLength; i++) {
StringBuilder sb = new StringBuilder();
for (String s1 : split) {
int tempLength = s1.length();
if(tempLength > i) {
char c = s1.charAt(i);
sb.append(c);
}else if(tempLength <= i) {
sb.append(" ");
}
}
int endIndex = sb.length() - 1;
for (; endIndex >=0 ; endIndex--) {
char c = sb.charAt(endIndex);
if(c != ' ') {
break;
}
}
list.add(sb.substring(0,endIndex + 1));
}
return list;
}
}
