在 JavaScript 中垂直打印单词



我正在尝试在Javascript中实现这个算法。

给定一个字符串 s. 以它们在 s 中出现的相同顺序垂直返回所有单词。 单词作为字符串列表返回,必要时用空格完成。(不允许使用尾随空格(。 每个单词将只放在一列中,而在一列中将只有一个单词。

Input: s = "TO BE OR NOT TO BE"
Output: ["TBONTB","OEROOE","   T"]
Explanation: Trailing spaces is not allowed. 
"TBONTB"
"OEROOE"
"   T"

我的解决方案:

var printVertically = function(s) {
let ans = [];
if(s === null || s.length === 0)
return ans;

let arr = s.split(" ");
let biggest = 0;
for(let i=0; i<arr.length; i++){
if(arr[i].length > biggest)
biggest = arr[i].length;
}

let getBigWord = false;
while(arr.length !== 0) {
let word = arr.shift().split("");
if(!getBigWord && word.length === biggest)
getBigWord = true;
for(i=0; i<biggest; i++){
if(ans.length <= i)
ans[i] = word[i] === undefined ? " " : word[i];
else if(word[i] !== undefined) {
ans[i] += word[i];
} else if(!getBigWord) {
ans[i] += " ";
}
}
}

return ans;
};

对于上面的输入,它有效。但是,如果我更改输入,解决方案将不起作用。例如:

Input: s = "CONTEST IS COMING"
Output: ["CIC","OSO","N M","T I","E N","S G","T"]

我的输出将是:["CIC","OSO","NM","TI","EN","SG","T"]

有谁知道我做错了什么?

谢谢

基本上,这是一系列简单的操作:

  1. 将字符串拆分为单词。
  2. 创建矩阵(二维数组(。字符串中的最长单词是矩阵的高度(行计数(,字符串数的长度是宽度(列计数(。
  3. 将字符串中的单词放入旋转的数组中,即交换ijs,其中i是行,j是列。
  4. 连接并修剪每行的右侧。

const verticize = s => {
const words = s.split(/s+/);
return [...Array(Math.max(...words.map(e => e.length)))]
.map((_, i) => 
[...Array(words.length)]
.map((_, j) => words[j][i] || " ").join("").trimEnd());
};
console.log(verticize("CONTEST IS COMING"));

你永远不会重置getBigWord的值,所以一旦你看到一个大词,它就无法正常工作。此外,它看起来不能正常工作多个大词。

这似乎效果更好:

var printVertically = function(s) {
let ans = [];
if(s === null || s.length === 0)
return ans;
let arr = s.split(" ");
let biggest = 0;
for(let i=0; i<arr.length; i++){
if(arr[i].length > biggest)
biggest = arr[i].length;
}
while(arr.length !== 0) {
let word = arr.shift().split("");
let getBigWord = false
if(word.length === biggest) {
getBigWord = true;
}
for(i=0; i<biggest; i++){
if(ans.length <= i)
ans[i] = word[i] === undefined ? " " : word[i];
else if(word[i] !== undefined) {
ans[i] += word[i];
} else if(!getBigWord) {
ans[i] += " ";
}
}
}
for(i = 0; i < ans.length; i++) {
// Modern version :
// ans[i] = ans[i].trimRight(); 
ans[i] = ans[i].replace(/s+$/g, "");
}
return ans;
};

我需要在最后修剪以避免多余的空间

最新更新