格式化充值卡密码

问题描述

给定一个只包含小写英文字母和中横线 (-) 的字符串 str 作为原始密码,以及一个正整数 len 作为分组长度。你需要按照以下规则格式化这个密码:

  1. 清理: 首先,移除原始密码字符串 str 中所有的中横线 -
  2. 分组: 将清理后的字符串从左到右按照每 len 个字符为一组进行划分。
  3. 补齐: 如果最后一组的字符数量不足 len 个,则在该组的末尾使用 # 字符进行补齐,直到该组的长度达到 len
  4. 连接: 将所有处理过的分组用中横线 - 连接起来,形成最终的格式化密码。如果只有一个分组,则无需连接。

输入与输出

  • 输入:
    • str (string): 一个只包含小写字母和中横线的字符串。
    • len (int): 每个分组的目标长度,为一个正整数。
  • 输出:
    • (string): 格式化后的密码字符串。

示例

示例 1:

  • 输入: str = 's-afa-vy', len = 3
  • 过程:
    1. 移除中横线: 'safavy'
    2. len=3 分组: ['saf', 'avy']
    3. 最后一组 'avy' 长度为 3,等于 len,无需补齐。
    4. - 连接: 'saf-avy'
  • 输出: 'saf-avy'

示例 2:

  • 输入: str = 's-afa-vytsbdg-', len = 4
  • 过程:
    1. 移除中横线: 'safavytsbdg'
    2. len=4 分组: ['safa', 'vyts', 'bdg']
    3. 最后一组 'bdg' 长度为 3,不足 4,需补一个 # -> 'bdg#'
    4. - 连接: 'safa-vyts-bdg#'
  • 输出: 'safa-vyts-bdg#'

示例 3:

  • 输入: str = 's-af', len = 5
  • 过程:
    1. 移除中横线: 'saf'
    2. len=5 分组: ['saf']
    3. 最后一组 'saf' 长度为 3,不足 5,需补两个 # -> 'saf##'
    4. - 连接(只有一组,无需连接): 'saf##'
  • 输出: 'saf##'

解题思路

JavaScript 的解法思路清晰直接。主要利用正则表达式进行清理,循环和 slice 进行分组,padEnd 进行补齐,最后用 join 连接。

  1. 清理字符串: 使用正则表达式 /-/g 匹配所有中横线,并配合 replace() 方法将其全部移除。
  2. 循环与分组: 创建一个空数组 parts 来存放分组。使用 for 循环,以 len 为步长,对清理后的字符串使用 slice() 方法进行切割,并将每个切片推入 parts 数组。
  3. 补齐末尾: 获取 parts 数组的最后一个元素(即最后一组)。检查其长度是否小于 len。若是,则使用 padEnd() 方法在其末尾用 # 补齐,直到长度达到 len
  4. 连接结果: 使用数组的 join('-') 方法将所有分组用中横线连接起来,生成最终的格式化字符串。

代码实现

/**
 * 格式化充值卡密码
 * @param {string} s - 只包含小写英文字母和中横线的输入字符串
 * @param {number} length - 每个分组的长度
 * @returns {string} - 格式化后的字符串
 */
function formatRechargeCard(s, length) {
  // 1. 移除所有中横线
  const cleanedStr = s.replace(/-/g, '');

  // 如果清理后为空字符串,直接返回
  if (!cleanedStr) {
    return '';
  }

  // 2. 将字符串分割成长度为 length 的子串数组
  const parts = [];
  for (let i = 0; i < cleanedStr.length; i += length) {
    parts.push(cleanedStr.slice(i, i + length));
  }

  // 3. 处理最后一组,如果长度不足则补 '#'
  let lastPart = parts[parts.length - 1];
  if (lastPart.length < length) {
    // 使用 padEnd 方法进行右侧填充,并用 '#' 补齐
    parts[parts.length - 1] = lastPart.padEnd(length, '#');
  }

  // 4. 用中横线连接所有分组
  return parts.join('-');
}

// --- 测试用例 ---
console.log(`输入: str='s-afa-vy', len=3`);
console.log(`输出: ${formatRechargeCard('s-afa-vy', 3)}`); // 预期: saf-avy

console.log(`输入: str='s-afa-vytsbdg-', len=4`);
console.log(`输出: ${formatRechargeCard('s-afa-vytsbdg-', 4)}`); // 预期: safa-vyts-bdg#

console.log(`输入: str='s-af', len=5`);
console.log(`输出: ${formatRechargeCard('s-af', 5)}`); // 预期: saf##
Copyright © Jun 2025 all right reserved,powered by Gitbook该文件修订时间: 2025-07-03 17:35:08

results matching ""

    No results matching ""

    results matching ""

      No results matching ""