题目
给你一个字符串s,请你按照单词在 s 中的出现顺序将它们全部竖直返回。
单词应该以字符串列表的形式返回,必要时用空格补位,但输出尾部的空格需要删除(不允许尾随空格)。
每个单词只能放在一列上,每一列中也只能有一个单词。
示例
示例1:
输入:s = "HOW ARE YOU"
输出:["HAY","ORO","WEU"]
解释:每个单词都应该竖直打印。 "HAY" "ORO" "WEU"
示例2:
输入:s = "TO BE OR NOT TO BE"
输出:["TBONTB","OEROOE"," T"]
解释:题目允许使用空格补位,但不允许输出末尾出现空格。 "TBONTB" "OEROOE" " T"
示例3:
输入:s = "CONTEST IS COMING"
输出:["CIC","OSO","N M","T I","E N","S G","T"]
提示:
1 <= s.length <= 200
s 仅含大写英文字母。
题目数据保证两个单词之间只有一个空格。
题解
第一种方法
以下是第一位大佬的代码
// ◆封装获取竖直打印单词的函数
function getRes(str) {
let arr = str.split(' ')
let res = []
arr.forEach(item => {
for (let i = 0; i < item.length; i++) {
if (!res[i]) {
res[i] = item[i]
} else {
res[i] += item[i]
}
}
})
return res
}
// ◆测试用例
let s1 = 'HOW ARE YOU'
let s2 = "CONTEST IS COMING"
let s3 = "TO BE OR NOT TO BE"
console.log(getRes(s1));
// [ 'HAY', 'ORO', 'WEU' ]
console.log(getRes(s2));
// ['CIC', 'OSO', 'NM', 'TI', 'EN', 'SG','T']
console.log(getRes(s3));
// [ 'TBONTB', 'OEROOE', 'T' ]
乍一看,没毛病。编译执行的时候正确率却只有45.45%,原来是漏掉空格补位。于是又请教大佬:
// ◆封装获取竖直打印单词的函数
function getRes1(str) {
let arr = str.split(' ')
let max = 0
for (let i = arr.length - 1; i >= 0; i--) {
max = Math.max(max, arr[i].length)
let t = max - arr[i].length
while (t--) {
arr[i] += ' '
}
}
let res = new Array(max).fill('')
for (let i = 0; i < max; i++) {
for (let j = 0; j < arr.length; j++) {
if (arr[j][i] !== undefined) {
res[i] += arr[j][i]
}
}
}
return res
}
// ◆测试用例
let s1 = 'HOW ARE YOU'
let s2 = "CONTEST IS COMING"
let s3 = "TO BE OR NOT TO BE"
console.log(getRes1(s1));
// [ 'HAY', 'ORO', 'WEU' ]
console.log(getRes1(s2));
// [ 'CIC', 'OSO', 'N M', 'T I', 'E N', 'S G', 'T' ]
console.log(getRes1(s3));
// [ 'TBONTB', 'OEROOE', ' T' ]
第二种方法
以下是第二位大佬的写法
// ◆封装获取竖直打印单词的函数
function getRes2(str) {
let strArr = str.split(' ')
let lenArr = []
let resArr = []
let maxLen = 0
strArr.forEach(item => {
lenArr.push(item.length)
})
// 确定打印单词的最大长度
maxLen = Math.max(...lenArr)
for (let i = 0; i < maxLen; i++) {
let newStr = ''
// 开头补空格
strArr.forEach(item => {
newStr += (item[i] ? item[i] : ' ')
})
// 末尾删空格
if (newStr[newStr.length - 1] == ' ') {
newStr = newStr.replace(/(\s*$)/g, '');
}
resArr.push(newStr)
}
return resArr
}
// ◆测试用例
let s1 = 'HOW ARE YOU'
let s2 = "CONTEST IS COMING"
let s3 = "TO BE OR NOT TO BE"
console.log(getRes2(s1));
// [ 'HAY', 'ORO', 'WEU' ]
console.log(getRes2(s2));
// [ 'CIC', 'OSO', 'N M', 'T I', 'E N', 'S G', 'T' ]
console.log(getRes2(s3));
// [ 'TBONTB', 'OEROOE', ' T' ]
当然,感觉题目不严谨,我查了很多资料,发现开头空格补位:有的差几个就补几个空格;有的不管差几个只补一个空格。下面我们把开头只补一个空格的也写下吧
function getRes2(str) {
let strArr = str.split(' ')
let lenArr = []
let resArr = []
let maxLen = 0
strArr.forEach(item => {
lenArr.push(item.length)
})
maxLen = Math.max(...lenArr)
for (let i = 0; i < maxLen; i++) {
let newStr = ''
let isAdd = true
strArr.forEach(item => {
newStr += (item[i] ? item[i] : isAdd ? ' ' : '')
isAdd = !!item[i]
})
if (newStr[newStr.length - 1] == ' ') {
newStr = newStr.substring(0, newStr.length - 1)
}
resArr.push(newStr)
}
return resArr
}
let s1 = 'HOW ARE YOU'
let s2 = "CONTEST IS COMING"
let s3 = "TO BE OR NOT TO BE"
console.log(getRes2(s1));
// [ 'HAY', 'ORO', 'WEU' ]
console.log(getRes2(s2));
// [ 'CIC', 'OSO', 'N M', 'T I', 'E N', 'S G', 'T' ]
console.log(getRes2(s3));
// [ 'TBONTB', 'OEROOE', ' T' ]