编辑:由于人们似乎有点困惑,我会尽力澄清。
基本上,你所采用的字符串是一个可变的字符长度,可以是任意数量的行。
故障是字符串不得切断一个字。所以,作为另一个例子,字符串:
'跳狐'分为2个单独的行。 中间字符是'u',所以两行将是: 第1行:'跳跃' 第2行:'Fox' 防止这个词被切断。这就是两个限制。
所以,我有这个问题:
给定单行文本字符串和最大行值,编写格式化输入文本的函数,即:根据字符均匀地划分文本,并为字符串的每个部分返回一个新行。但是不要切断一条线 - 也就是说,如果你有1000个字符和2行,你可以增加第一行的大小来捕获第500个字符中间的最后一个字的结尾。
我正试图用JavaScript解决它。有小费吗?
。这很简单,只需返回没有这种空白格式的行,但我完全迷失了。function formatString(string, numlines) {
var length = string.length;
console.log(length);
var words = string.split(' ');
var paraLength = parseInt(string.length/numlines);
console.log(paraLength)
var paragraph = [];
for(var i=0; i<length;) {
// console.log('i is: ', i);
console.log('start of string is: ', string.charAt(i));
console.log('end of string is: ', string.charAt(i+paraLength+1));
console.log('if true? ', string.indexOf(i) )
if (string.charAt(i+paraLength) == ' ') {
var thing = string.substr(i,i+paraLength);
console.log('if thing is: ', thing);
i+=paraLength;
console.log('if i is: ', i);
paragraph.push(thing);
} else {
var thing = string.substr(i,i+paraLength);
console.log('else thing is: ', thing);
console.log('blah is: ',i+paraLength+1 >= length);
while (string.charAt(i+paraLength) != ' ' && i+paraLength < length) {
thing.concat(string.charAt(i+paraLength+1));
thing.concat('hi')
console.log('else thing is: ', thing);
i+=1;
console.log('i is: ', i);
}
paragraph.push(thing);
i+= paraLength;
}
}
return paragraph.map(function(d) {
console.log('d is: ', d);
return d;
}).join('')
}
console.log(formatString('hello world blah blah blah', 2));
答案 0 :(得分:2)
如果我理解你的问题,这可能会有所帮助:
function formatString(string, numlines) {
var length = string.length;
var paraLength = Math.round((string.length)/numlines);
var paragraphs = [];
for (var i=0; i<numlines; i++) {
var marker = paraLength;
//if the marker is right after a space, move marker back one character
if (string.charAt(marker-1) == " ") {
marker--;
}
//move marker to end of a word if it's in the middle
while(string.charAt(marker) != " " && string.charAt(marker) != "") {
marker++;
}
var nextPara = string.substring(0, marker)
paragraphs.push(nextPara)
string = string.substring((nextPara.length+1),string.length)
}
return paragraphs
}
这将返回一个包含各个段落的数组。
formatString("The jumping fox", 2) // => ["The jumping", "fox"]
答案 1 :(得分:2)
建议的算法&#34;你可以增加第一行的大小来捕获第500个字符中间的最后一个字的结尾&#34;有一个致命的缺陷:如果你的最后一个字长于length(sentence)/num_lines
,所以你跳到下一个单词&#39;,你在那行打印出太多的单词,最后说的话太少 - 可能根本没有 - 在最后一行。
这可以通过不将字符串视为字符序列(您需要检查每个字符以查看它是否为空格)而非字符序列来解决。然后,算法是每行必须出现num_words/num_lines
。使用Math.ceil
向上舍入,这样您就可以确保每行至少出现一个单词。
有了这个,您可以创建一个基本的测试用例,以便在2中精确地分割单词列表。可以使用split
函数完成拆分本身,但我更喜欢正则表达式match
,所以所有空间都保留下来。 match
返回一个匹配数组,每个匹配项都是一个单词加上后面的空格。由于它是一个数组,你可以将它的长度除以行数,如果它是一个分数(Math.ceil
)则向上舍入,然后打印出这些单词。
接着?好吧,在那一步之后,你最终会得到一个尚未处理的原始字符串的剩余部分,并且还剩下许多行。所以你可以用截断的字符串和少一行来调用这个相同的函数。当行数为1
(然后可以打印整个剩余的字符串)和/或空格数为0
时,您就完成了(此处未进行测试;我想您可以先看看是否可以你有至少与空格一样多的空格 - 减1,如果没有,则发出错误。)
console.log(formatString('hello world blah blah blah', 2));
function formatString (string, numLines)
{
var wordlist, trim_at, result;
if (numLines < 2)
return string;
wordlist = string.match(/\S+\s*/g);
trim_at = Math.ceil(wordlist.length/numLines);
result = '';
while (trim_at--)
result += wordlist.shift();
result += '\n';
result += formatString (wordlist.join(''), numLines-1);
return result;
}