JavaScript字符串拆分:生成指定长度数组,优先双字符元素
解决字符串优先按双字符分割为指定长度数组的问题
问题分析
你需要将输入字符串分割成指定长度的数组,核心要求是优先让元素包含2个字符,直到剩余字符刚好能填满目标数组的剩余位置。现有代码的问题在于,它先按单个字符分割,再合并最后两个元素,导致结果不符合"优先双字符"的预期。
举个例子:
- 输入字符串:
"I like dogs"(11个字符) - 目标数组长度:8
- 现有输出:
["I", " ", "l", "i", "k", "e", " ", "dogs"] - 期望输出:
["I ", "li", "ke", " ", "d", "o", "g", "s"]
解决方案思路
我们可以通过数学推导确定双字符元素的数量:
设目标数组长度为M,总字符数为N,x为双字符元素的数量,y为单字符元素的数量。
根据条件可得:
2x + y = N(总字符数等于所有元素的字符数之和)x + y = M(元素总数等于目标数组长度)
联立方程解得:x = N - M,y = 2M - N。
这个结果告诉我们:先创建x个双字符元素,再用y个单字符元素填充剩余位置,就能完美符合需求。
修改后的代码
var input = "I like dogs"; // 11 characters var tilesNeeded = Math.round(input.length / 2) + 1; // 7 tiles initially if (isPrime(tilesNeeded)) { tilesNeeded += 1; // Adjust to 8 tiles since 7 is prime } const totalChars = input.length; const result = []; let currentIndex = 0; // Calculate how many tiles can hold 2 characters const twoCharTileCount = totalChars - tilesNeeded; // First add all 2-character tiles for (let i = 0; i < twoCharTileCount; i++) { result.push(input.slice(currentIndex, currentIndex + 2)); currentIndex += 2; } // Fill remaining slots with 1-character tiles while (result.length < tilesNeeded) { result.push(input.slice(currentIndex, currentIndex + 1)); currentIndex += 1; } console.log(result); // Output: ["I ", "li", "ke", " ", "d", "o", "g", "s"] function isPrime(num) { for (var i = 2, s = Math.sqrt(num); i <= s; i++) { if (num % i === 0) return false; } return num > 1; }
代码解释
- 计算双字符元素数量:
twoCharTileCount = totalChars - tilesNeeded,这里得到3个双字符元素(11-8=3)。 - 生成双字符元素:循环截取字符串的前3组双字符,依次加入数组。
- 填充单字符元素:剩余的位置用单个字符填充,直到数组长度达到目标的8个。
这样处理后,就能得到你期望的输出——优先使用双字符元素,剩余位置用单字符补全,刚好填满目标数组长度。
内容的提问来源于stack exchange,提问作者brandoncalvin




