Logo
Section 1 / 6

子任务解决方案:拆分行

项目“文本对齐”中子任务“拆分行”的解决方案。

导入

子任务解决方案:拆分行

项目“文本对齐”中子任务“拆分行”的解决方案。

拆分行

在此步骤中,将行的数组表示拆分为两个子数组。第一个子数组满足文档宽度约束。

1function splitLine(line, width){ 2 // 基础情况 3 if (line.length === 0) return [[], []]; // 行长度为零 4 if (width === 0) return [[], line]; // 文档宽度为零 5 let [head, ...rest] = line; // 解构行,移除第一个元素 6 // 递归情况 7 if(head.length <= width){ 8 // 如果宽度大于等于第一个单词的长度 9 // 递归调用剩余行,并减少宽度 10 let sub_answer = splitLine(rest, width - (head.length + 1)) 11 // 将第一个单词加入递归结果中 12 return [[head, ...sub_answer[0]],[...sub_answer[1]]]; 13 } 14 else{ 15 // 也是基础情况 16 return [[], line]; 17 } 18} 19 20console.log(splitLine (["He", "who", "controls"], 15)) 21console.log(splitLine (["A", "creative", "man"], 10)) 22console.log(splitLine (["A", "creative", "man"], 11)) 23console.log(splitLine (["A", "creative", "man"], 12))

该解决方案采用递归方法,其基础情况包括:

  • 当 line 的长度为零时(第3行)

  • 当 width 的值为零时(第4行)

  • 当 line 的第一个元素长度大于 width 时(第16行)

对于每种情况,相应地返回结果。在递归情况下,更新 width,移除 line 的第一个元素,并递归调用 splitLine(第10行)。结果应为我们针对新宽度(即原宽度减去移除元素的长度再减去一个空格)所得到的完美拆分行。最后,将被移除的元素重新插入到结果的开头,并返回该结果(第12行)。这通过递归方式解决了问题。

JavaScript 函数

子任务换行解决方案