格式化充值卡密码
问题描述
给定一个只包含小写英文字母和中横线 (-
) 的字符串 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##