You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JavaScript字符串拆分:生成指定长度数组,优先双字符元素

解决字符串优先按双字符分割为指定长度数组的问题

问题分析

你需要将输入字符串分割成指定长度的数组,核心要求是优先让元素包含2个字符,直到剩余字符刚好能填满目标数组的剩余位置。现有代码的问题在于,它先按单个字符分割,再合并最后两个元素,导致结果不符合"优先双字符"的预期。

举个例子:

  • 输入字符串:"I like dogs"(11个字符)
  • 目标数组长度:8
  • 现有输出:["I", " ", "l", "i", "k", "e", " ", "dogs"]
  • 期望输出:["I ", "li", "ke", " ", "d", "o", "g", "s"]

解决方案思路

我们可以通过数学推导确定双字符元素的数量:
设目标数组长度为M,总字符数为Nx为双字符元素的数量,y为单字符元素的数量。
根据条件可得:

  1. 2x + y = N(总字符数等于所有元素的字符数之和)
  2. x + y = M(元素总数等于目标数组长度)

联立方程解得:x = N - My = 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;
}

代码解释

  1. 计算双字符元素数量twoCharTileCount = totalChars - tilesNeeded,这里得到3个双字符元素(11-8=3)。
  2. 生成双字符元素:循环截取字符串的前3组双字符,依次加入数组。
  3. 填充单字符元素:剩余的位置用单个字符填充,直到数组长度达到目标的8个。

这样处理后,就能得到你期望的输出——优先使用双字符元素,剩余位置用单字符补全,刚好填满目标数组长度。

内容的提问来源于stack exchange,提问作者brandoncalvin

火山引擎 最新活动