问题
输入一个数字字符串,由 ',' 分隔开,每次只能操作任意一个数字,并且只能进行加一操作,问:若要该字符串没有重复元素,至少操作几次。
思路及代码
# 我的思路:先将字符串转为整型列表,然后进行排序(从小到大),遍历逐个元素,若结果中没有该元素则加入;若结果中存在该元素且后一个元素-该元素>1,那么进行加一(再判断加一之后是否在B中,如果在B中那么不断加一,不在则直接加入结果中)
while True: # 不知道输入几组时,可以用while True或while 1
A0 = list(input())
B = []
for item in A0:
if item != ',':
B.append(item)
B = list(map(int, B))
if len(set(B)) == len(B): # 如果B中没有重复元素,那么不需要进行操作,操作次数是0
print(0)
continue
B.sort()
result = []
count = 0
for i in range(len(B)):
if i + 1 < len(B):
if B[i] not in result:
result.append(B[i])
continue
if B[i] in result and B[i+1]-B[i] > 1:
result.append(B[i]+1)
count += 1
elif B[i] in result:
tmp = B[i] + 1
while tmp in B:
tmp = tmp + 1
count += 1
result.append(tmp)
if B[len(B) - 1] not in result: # i+1索引的出现,让上面的for执行不到最后一个元素,因此这里要检查最后一个元素
result.append(B[len(B) - 1])
else:
result.append(B[len(B) - 1] + 1)
count += 1
print(count)
############### 网上参考的代码 ###############
while True:
A0 = list(input())
B = []
for item in A0:
if item != ',':
B.append(item)
B = list(map(int, B)) # 字符串列表转换为整型列表
if B == list(set(B)):
print(0)
continue
tmp = set() # 空集合
count = 0
for item in B:
while item in tmp:
item += 1
count += 1
tmp.add(item)
print(count)
知识点
1. 集合和列表的区别
(1) s.add(x):是往集合里面添加元素,是 set 的操作,list 没有!
(2) l.insert(index, x):是往列表的某个索引插入元素,是列表的操作,set 没有!