You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多整数无分隔符合并与可逆还原的技术实现问询

解决方案:无分隔符的整数集合合并与还原

针对你提出的需求——把任意整数集合合并成纯数字/十六进制字符串(不能用非数字分隔符),且能无损还原,这里提供几个鲁棒性强的可行方案,附带代码实现:

方案1:固定长度填充法

这个方案简单直观,核心思路是统一集合中所有整数的字符串长度:

  1. 遍历整数集合,找到位数最多的那个数字,确定统一长度maxLen;
  2. 把每个整数转成字符串,用前导零填充到maxLen位;
  3. 拼接所有填充后的字符串得到合并结果;
  4. 还原时,按maxLen长度拆分合并字符串,再把每个拆分后的子串转成整数(自动忽略前导零)。

代码实现

function combineIntoOneInteger(integers) {
  if (integers.length === 0) return '';
  // 计算最大位数
  const maxLen = Math.max(...integers.map(num => num.toString().length));
  // 填充并拼接
  return integers.map(num => num.toString().padStart(maxLen, '0')).join('');
}

function deconstructInteger(combinedStr, arraySize) {
  if (!combinedStr) return [];
  const maxLen = combinedStr.length / arraySize;
  return Array.from({ length: arraySize }, (_, i) => {
    const start = i * maxLen;
    const numStr = combinedStr.slice(start, start + maxLen);
    return parseInt(numStr, 10);
  });
}

优缺点

  • ✅ 逻辑简单,鲁棒性极强,几乎不会出现冲突;
  • ❌ 如果集合中有超大数,会导致合并后的字符串冗余过长。

方案2:可变长度前缀编码法

这个方案更灵活,用数字的位数作为前缀(前缀固定为2位,支持最多99位的整数),解决固定长度法的冗余问题:

  1. 每个整数转成字符串后,先记录它的位数(不足两位补前导零);
  2. 把“前缀+数字字符串”拼接起来,最终合并所有片段;
  3. 还原时,每次先读取前两位得到当前数字的长度n,再读取接下来n位得到原数字,循环直到字符串处理完毕。

代码实现

function combineIntoOneInteger(integers) {
  return integers.map(num => {
    const numStr = num.toString();
    // 用两位前缀表示数字长度
    const lenPrefix = numStr.length.toString().padStart(2, '0');
    return lenPrefix + numStr;
  }).join('');
}

function deconstructInteger(combinedStr) {
  const result = [];
  let index = 0;
  while (index < combinedStr.length) {
    // 读取两位前缀
    const len = parseInt(combinedStr.slice(index, index + 2), 10);
    index += 2;
    // 读取对应长度的数字字符串
    const numStr = combinedStr.slice(index, index + len);
    index += len;
    result.push(parseInt(numStr, 10));
  }
  return result;
}

优缺点

  • ✅ 字符串长度更紧凑,支持任意长度的整数(只要前缀位数足够,比如用3位前缀可支持999位数字);
  • ✅ 还原时不需要提前知道集合大小(方案1需要传入arraySize,这个方案不需要);
  • ❌ 需要约定前缀的位数,要根据业务场景选择合适的前缀长度。

方案3:十六进制紧凑编码法

如果允许用十六进制字符串,这个方案能让合并后的字符串最短,利用十六进制的紧凑性:

  1. 把每个整数转成十六进制字符串(注意转成小写或大写,保持一致);
  2. 用一位十六进制字符表示该十六进制字符串的长度(0-F对应0-15,支持最多15位十六进制数,足够覆盖绝大多数场景);
  3. 拼接“长度前缀+十六进制字符串”,得到最终合并结果;
  4. 还原时,每次读取一位十六进制字符转成十进制长度n,再读取接下来n位十六进制字符转成整数。

代码实现

function combineIntoOneInteger(integers) {
  return integers.map(num => {
    const hexStr = num.toString(16);
    // 用十六进制字符表示长度(0-F对应0-15)
    const lenPrefix = hexStr.length.toString(16);
    return lenPrefix + hexStr;
  }).join('');
}

function deconstructInteger(combinedStr) {
  const result = [];
  let index = 0;
  while (index < combinedStr.length) {
    // 读取十六进制前缀转成十进制长度
    const len = parseInt(combinedStr[index], 16);
    index += 1;
    // 读取对应长度的十六进制字符串
    const hexStr = combinedStr.slice(index, index + len);
    index += len;
    result.push(parseInt(hexStr, 16));
  }
  return result;
}

优缺点

  • ✅ 合并后的字符串长度最短,适合需要节省存储空间的场景;
  • ✅ 还原时无需提前知道集合大小;
  • ❌ 合并结果是十六进制字符串(符合你允许的“十六进制字符”要求);
  • ❌ 如果整数转十六进制后长度超过15位,需要调整前缀的位数(比如用两位十六进制前缀,支持0-255位长度)。

这些方案都完全避开了非数字/十六进制分隔符,且鲁棒性远高于“隐藏分隔符”的思路,你可以根据业务场景选择最合适的方案。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:27:13