蓝桥杯 2022 真题 消除数字 (测试用例全过版)

前言:

这道题并不是我自己一个人想出来的,我只是在诸位大佬的思路下解出这道题。

这道题想了2天,网络上也没有题解,使用模拟,或者set集合进行解题都会超时。

多谢 高天大哥,西电爷给的思路,在他们的思路下我对代码进行了细化最终全部测试用例通过。

解题思路:

1. 将字符合并成节点

例如:

aaaabbbbcccc

合并成

(a, 4), (b, 4), (c, 4) 注意,这里不是元组是链表节点的属性,第一个代表字符,第二个代表长度。

2. 遍历链表每个节点

3. 当节点size大于等于2时左右节点 -1 ,当前节点 - 2

4. 合并节点,当一个节点size <= 0 时被丢弃

代码

class ListNode:
    def __init__(self, char=None, size=0):
        self.char = char
        self.size = size
        self.next = None
        self.pre = None
        self.right = False
        self.left = False

    def __str__(self):
        return "(Char: %s, Size: %s, Left: %s, Right: %s)" % (self.char, self.size, self.left, self.right)

    __repr__ = __str__


s = input()
n = len(s)
idx = 0
head = ListNode()  # 头节点哨兵
node = head

# 初始化链表
while idx < n:
    cnt = 1  # size
    while idx + 1 < n and s[idx] == s[idx + 1]:  # 判断有无连续字符
        idx += 1
        cnt += 1
    cur = ListNode(s[idx], cnt)
    node.next = cur
    cur.pre = node
    node = cur
    idx += 1


def delete_node(node):
    pre = node.pre
    cur = node.next
    # 只剩一个头节点了 且为连续字符
    if node.pre == head and not node.next:
        return False
    # 头节点,且不唯一
    elif node.pre == head and node.next:
        cur.size -= 1 if not cur.left else 0
        cur.left = True if not cur.left else True

        node.size -= 1 if not node.right else 0
        node.right = True if not node.right else True
        return True
    # 中间节点
    elif node.pre and node.next:
        pre.size -= 1 if not pre.right else 0
        pre.right = True if not pre.right else True

        cur.size -= 1 if not cur.left else 0
        cur.left = True if not cur.left else True

        node.size -= 1 if not node.left else 0
        node.size -= 1 if not node.right else 0
        node.left = True if not node.left else True
        node.right = True if not node.right else True
        return True
    # 尾节点
    elif not node.next:
        pre.size -= 1 if not pre.right else 0
        pre.right = True if not pre.right else 0

        node.size -= 1 if not node.left else 0
        node.left = True if not node.left else True
        return True
    # 程序有问题
    else:
        print("什么情况?")
        return False


def merge_list_node(head):
    node = head
    while node:
        cur = node.next
        while cur and cur.size <= 0:
            cur = cur.next
            if cur and cur.char == node.char:  # 合并同类型,遇到相同的 char 合并它们的 size
                node.size += cur.size
                cur.size = 0
        node.next = cur
        node.left, node.right = False, False
        if cur is not None:
            cur.pre = node
            cur.left, cur.right = False, False
        node = cur


flag = True
while flag:
    flag = False  # 用来判断是否字符是否最简化了
    star = head.next
    while star:
        if star.size >= 2 or (star.left and star.size + 1 >= 2):
            # 进行删除
            flag = delete_node(star)
        star = star.next
    # f(head)
    merge_list_node(head)

p = head.next
ans = ""
while p:
    ans += p.char * p.size
    p = p.next
print(ans) if ans != "" else print("EMPTY")

测试用例:

"""

第一行输入
第二行答案

aaaaaaaaaaaaaaaaaaaaednecjkmlwidqdgpeiwzzzzzzzzzzzzzzyfknziqvbxkcfffffffffffffffeuflcloprejfqaaaaaaaaaaaafhfasthuafuuuuuuuuuuuuuuuuuuwauydwprcpgawtvbeeeeeeeeeeeetymnbxuipjcwshmvipeywvmditzrqvavugtvstj

aipeywvmditzrqvavugtvstj


mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmllllllllllllllllllllllllllllllllllllllllzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuujjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb

mmmmmmmmm


mmmmaaaaaaaaaaaaaaaaaaaaaaaaaaaaasssssssooooooooooooooooooooooooooottttttttllllllllllxxxxxxxxxxwwwwwwwwdddddddddduuuuuuuuuuuuuuuuuuuuuuuuuuyyyyyykkkkssssssssssvvvvvvmmmmmmmmnnnnnnnnnneeeeeeeeeeeeeeeeeeeeeeeeeeeeerrrrrrrrrrrrrrrrrrrrrrrrrrffffffffccccccttttttttaaaaaajjjjjjddddddddddddddddddddddddddggggggggggggggggggjjjjjjjjjjggggggggggoooooooooooooooooooooooooooooonnnnnddddddddddkkkkkkppppppwwwwwwllllllllllrrrrrraaaaaaaaaaammmmmmmmmmmmmmmmmmmmmmmggggwwwwwwwwwwvvvvvvggggggggyyyyyyffffffffffffffffffffffffffffffdddddddbbbbbbbbbbbbbbbbbbbbbbyyyyyyyytttt

aaaaaaa
"""

总结:

在这次真题的思考中我明白了一件事,力扣刷多了并不代表我很强,我刷蓝桥杯一样会被暴捶,我会继续学习,继续努力的。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值