给定一个密钥字符串S,只包含字母,数字以及 ‘-‘(破折号)。N 个 ‘-‘ 将字符串分成了 N+1 组。给定一个数字 K,重新格式化字符串,除了第一个分组以外,每个分组要包含 K 个字符,第一个分组至少要包含 1 个字符。两个分组之间用 ‘-‘(破折号)隔开,并且将所有的小写字母转换为大写字母。

给定非空字符串 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 被分成了 3 个部分,按照前面的规则描述,第一部分的字符可以少于给定的数量,其余部分皆为 2 个字符。

只能说这个题目没有解释清楚,一开始我以为是第一组保持不变,然后后面的转大写然后去按照K个字母来进行分组,思路就是先读取这个字符串第一个’-‘的位置,然后把后面的’-‘全部去除掉,然后根据K来进行插入’-‘即可

python代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
def func(S,K):
S = list(S.upper())
first = 0
lens = len(S)
offset = 0
popList = []
popoffset = 0
for i in range(lens):
if(S[i]=='-' and first!=1):
first = 1
offset = i
elif(S[i]=='-'):
popList.append(i)
lens-=1
for i in popList:
S.pop(i-popoffset)
popoffset+=1
res = lens-(offset+1)
res_char_num = K
insertList = []
for i in range(offset+1,lens):
if((i-offset-1)%res_char_num==0 and (i-offset-1)!= 0):
insertList.append(i)
insertOffset = 0
for i in insertList:
S.insert(i+insertOffset,'-')
insertOffset+=1
return ''.join(S)


S = '5F3Z-2e-9-w'
K = 4
print(func(S,K))

没想到报错了,我寻思我这个很符合题意啊

1
2
3
4
5
6
7
8
执行结果:解答错误 显示详情
输入:
"2-4A0r7-4k"
4
输出
"2-4A0R-74K"
预期结果
"24A0-R74K"

看了题解才知道,这个题目的意思就是,前面第一组的长度S<=K 后面每一组的长度S==k,这个锅要怪出题人没有解释清楚

然后修改代码,去掉’-‘,从后往前找到插入’-‘的位置插入即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def func(S,K):
S = list(S.upper().replace('-',''))
insertList = []
insertOffset = 0
n = 1
for i in range(len(S)-1,0,-1):
if(n%K==0):
insertList.append(i)
n+=1
insertList.sort()
for i in insertList:
S.insert(i+insertOffset,'-')
insertOffset+=1
return ''.join(S)
S = '5F3Z-2e-9-w'
K = 4
print(func(S,K))

通过