1093 字符串A+B (20 分)

1093 字符串A+B (20 分)

题意描述:

给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集。要求先输出 A,再输出 B,但重复的字符必须被剔除。

输入格式:
输入在两行中分别给出 A 和 B,均为长度不超过 10^​6​​ 的、由可见 ASCII 字符 (即码值为32~126)和空格组成的、由回车标识结束的非空字符串。

输出格式:
在一行中输出题面要求的 A 和 B 的和。

输入样例:

This is a sample test
to show you_How it works

输出样例:

This ampletowyu_Hrk

解题思路:
Mara: 这题好做呀,就去重,不不不,直接打个标记,然后就按题意来就行了。
Jack: 题目里面最大的输入可是10^6长度的字符串啊。用Python 怕是会超时。
Mara: 先试试呗。

def main():
    string1 = input()
    string2 = input()
    flags = [0 for x in range(32, 127)]
    answer = []
    for x in string1:
        if flags[ord(x) - 32] == 0:
            answer.extend([x])
            flags[ord(x) - 32] = 1
    for x in string2:
        if flags[ord(x) - 32] == 0:
            answer.extend([x])
            flags[ord(x) - 32] = 1
    print(''.join(answer))

if __name__ == '__main__':
    main()

最后两个测试点全超时了。o(╥﹏╥)o
Jack: 莫慌莫慌,我有办法!“即码值为32~126”,也就是说答案字符串的长度是有限的,最多才是把所有的字符都算一遍。这也才126 - 32 + 1 == 95 个。中间可以直接判断是不是所有字符都已经出现了,如果是,后面的字符就没有必要再处理了,因为肯定是不会出现的。像这样:

def main():
    string1 = input()
    string2 = input()
    flags = [0 for x in range(32, 127)]
    answer = []
    for x in string1:
        if flags[ord(x) - 32] == 0:
            answer.extend([x])
            flags[ord(x) - 32] = 1
        if sum(flags) == 126 - 32 + 1:
            break
    for x in string2:
        if flags[ord(x) - 32] == 0:
            answer.extend([x])
            flags[ord(x) - 32] = 1
        if sum(flags) == 126 - 32 + 1:
            break
    print(''.join(answer))


if __name__ == '__main__':
    main()

还有一个测试点超时了,最后一个点。∑(っ°Д°;)っ。
Mara: 让我看看,(o゚▽゚)o 打标记的部分可以用字典啊,这样也不用ord( ) 了,这样能快一点,而且把 126 - 32 + 1 的值算出来吧。Python 没有编译的过程,也不知道会不会自动优化这个计算。快去试试。
Jack: 过了!!(づ ̄3 ̄)づ╭❤~


代码:

def main():
    string1 = input()
    # 接收字符串A
    string2 = input()
    # 接收字符串B
    flags = {}
    # 一个字典,用来记录已经出现了的字符
    answer = []
    # answer 用来记录最终将要输出的字符们
    for string in (string1, string2):
        # 依次考虑字符串A 和 B
        for x in string:
            # 对A串或B串中的每个字符
            if x not in flags:
                # 若该字符尚未出现过,让这个字符上场吧。
                answer.extend([x])
                # 为什么要用extend呢? extend快呀。为什么是[x] 而不是 x 呢? 
                # 因为extend() 只接收列表呀。
                flags[x] = None
                # 这个字符出现了,打上标记。打标记的操作可能会重复哦。
            if len(flags) == 95:
                # 嘿嘿嘿,如果所有的字符都出现了,那后面的字符们就没机会再上场
                # 了。这也太惨了。
                # 95 == 126 - 32 + 1
                break

    print(''.join(answer))
    # 输出答案喽。


if __name__ == '__main__':
    main()


易错点:

  • 用Python 处理字符串很方便,就是容易超时。超时怎么办?继续优化呗。怎么优化 ? 把执行效率低的方法换成执行效率高的方法,把执行效率低的数据结构换成执行效率高的数据结构。然后,减少重复的计算,省略不必要的计算 !

总结:

美滋滋 o(*≧▽≦)ツ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值