格式化充值卡密码
问题描述
给定一个只包含小写英文字母和中横线 (-) 的字符串 str 作为原始密码,以及一个正整数 len 作为分组长度。你需要按照以下规则格式化这个密码:
- 清理: 首先,移除原始密码字符串
str中所有的中横线-。 - 分组: 将清理后的字符串从左到右按照每
len个字符为一组进行划分。 - 补齐: 如果最后一组的字符数量不足
len个,则在该组的末尾使用#字符进行补齐,直到该组的长度达到len。 - 连接: 将所有处理过的分组用中横线
-连接起来,形成最终的格式化密码。如果只有一个分组,则无需连接。
输入与输出
- 输入:
str(string): 一个只包含小写字母和中横线的字符串。len(int): 每个分组的目标长度,为一个正整数。
- 输出:
- (string): 格式化后的密码字符串。
示例
示例 1:
- 输入:
str = 's-afa-vy',len = 3 - 过程:
- 移除中横线:
'safavy' - 按
len=3分组:['saf', 'avy'] - 最后一组
'avy'长度为 3,等于len,无需补齐。 - 用
-连接:'saf-avy'
- 移除中横线:
- 输出:
'saf-avy'
示例 2:
- 输入:
str = 's-afa-vytsbdg-',len = 4 - 过程:
- 移除中横线:
'safavytsbdg' - 按
len=4分组:['safa', 'vyts', 'bdg'] - 最后一组
'bdg'长度为 3,不足 4,需补一个#->'bdg#'。 - 用
-连接:'safa-vyts-bdg#'
- 移除中横线:
- 输出:
'safa-vyts-bdg#'
示例 3:
- 输入:
str = 's-af',len = 5 - 过程:
- 移除中横线:
'saf' - 按
len=5分组:['saf'] - 最后一组
'saf'长度为 3,不足 5,需补两个#->'saf##'。 - 用
-连接(只有一组,无需连接):'saf##'
- 移除中横线:
- 输出:
'saf##'
解题思路
JavaScript 的解法思路清晰直接。主要利用正则表达式进行清理,循环和 slice 进行分组,padEnd 进行补齐,最后用 join 连接。
- 清理字符串: 使用正则表达式
/-/g匹配所有中横线,并配合replace()方法将其全部移除。 - 循环与分组: 创建一个空数组
parts来存放分组。使用for循环,以len为步长,对清理后的字符串使用slice()方法进行切割,并将每个切片推入parts数组。 - 补齐末尾: 获取
parts数组的最后一个元素(即最后一组)。检查其长度是否小于len。若是,则使用padEnd()方法在其末尾用#补齐,直到长度达到len。 - 连接结果: 使用数组的
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##