【20190902】【校招笔试题】最少的操作次数_新浪

问题

输入一个数字字符串,由 ',' 分隔开,每次只能操作任意一个数字,并且只能进行加一操作,问:若要该字符串没有重复元素,至少操作几次。


思路及代码

# 我的思路:先将字符串转为整型列表,然后进行排序(从小到大),遍历逐个元素,若结果中没有该元素则加入;若结果中存在该元素且后一个元素-该元素>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 没有!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Satisfying

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值