Javascript 在添加字符时,从数组末尾循环后重新索引数组时遇到问题

Javascript 在添加字符时,从数组末尾循环后重新索引数组时遇到问题,javascript,string,algorithm,for-loop,splice,Javascript,String,Algorithm,For Loop,Splice,我试图解决这个特殊的算法问题: 您将获得一个表示为字符串S的许可证密钥,该字符串仅由字母数字字符和破折号组成。字符串由N个破折号分隔为N+1个组 给定一个数字K,我们希望重新格式化字符串,使每个组正好包含K个字符,但第一个组可能短于K,但必须至少包含一个字符。此外,必须在两个组之间插入破折号,所有小写字母都应转换为大写 给定一个非空字符串S和一个数字K,根据上述规则格式化该字符串 例1: 输入:S=“5F3Z-2e-9-w”,K=4 输出:“5F3Z-2E9W” 说明:字符串S分为两部分,每部分

我试图解决这个特殊的算法问题:

您将获得一个表示为字符串S的许可证密钥,该字符串仅由字母数字字符和破折号组成。字符串由N个破折号分隔为N+1个组

给定一个数字K,我们希望重新格式化字符串,使每个组正好包含K个字符,但第一个组可能短于K,但必须至少包含一个字符。此外,必须在两个组之间插入破折号,所有小写字母都应转换为大写

给定一个非空字符串S和一个数字K,根据上述规则格式化该字符串

例1: 输入:S=“5F3Z-2e-9-w”,K=4

输出:“5F3Z-2E9W”

说明:字符串S分为两部分,每部分有4个字符。 注意,不需要另外两个破折号,可以删除。 例2: 输入:S=“2-5g-3-J”,K=2

输出:“2-5G-3J”

说明:字符串S被分为三部分,除第一部分外,每个部分有2个字符,因为它可能比上面提到的更短。 注: 字符串S的长度将不超过12000,且K为正整数。 字符串S仅由字母数字字符(a-z和/或a-z和/或0-9)和破折号(-)组成。 字符串S不是空的

我编写了以下代码:

const licenseKeyFormatting = (S, K) => {
    //convert to array, remove special characters, and capitalize
    let s = [...S.replace(/\W/g, '').toUpperCase()]
    let pos = 1
    //from end of array add '-' for every K
    for (let i = s.length - 1; i > 0; i--) {
        if (pos === K) {
            s.splice(i, 0, '-')
            pos = 1
            i-- //re-index bc adding to the array
        }
        pos++
    }
    return s
}


console.log(licenseKeyFormatting("5F3Z-2e-9-w", 4)) //5F3Z-2E9W
console.log(licenseKeyFormatting("2-5g-3-J", 2)) //2-5G-3J
console.log(licenseKeyFormatting("a-a-a-a-", 1)) // this test case fails should be A-A-A-A, I am getting AAA-A
我很确定我的逻辑中的缺陷是由于重新索引造成的,但我不知道如何解决它。

我的方式

函数licenseKeyFormatting(S,K)
{
设arr=[…S.replace(/\W/g',).toUpperCase()]
,p=0
;
for(设i=arr.length;i--;)
{
p=++p%K//p=(p+1)%K
if(!p&&i)arr.splice(i,0,'-')//如果p==0且i>0
}
返回arr.join(“”)
}
log(licenseKeyFormatting(“5F3Z-2e-9-w”,4))//5F3Z-2E9W
log(licenseKeyFormatting(“2-5g-3-J”,2))//2-5g-3J

log(licenseKeyFormatting(“a-a-a-a-”,1))//a-a-a-a
您不应该更改索引。使用
splice
插入一个元素会将其他元素向后推,但是,由于您从后向前迭代,这并不重要。您已经处理了移位的元素

另一个问题是在循环中设置
pos=1
。紧接着是
pos++
。因此,当
pos
达到
K
时,
pos
的值将在循环结束时重置为
2
。要么设置
pos=0
(在循环中),使其在
1
上结束,要么将
pos++
移动到
else
部分

constLicenseKeyFormatting=(S,K)=>{
//转换为数组、删除特殊字符并大写
设s=[…s.replace(/\W/g',).toUpperCase()]
设pos=1
//从数组末尾开始,每K添加“-”
对于(设i=s.length-1;i>0;i--){
如果(位置===K){
s、 拼接(i,0,'-')
pos=0
}
位置++
}
returns s.join(“”//添加了新答案(更简单,而不是忍者代码)