针对此Codejam问题,Python中更快或更高内存的解决方案
我尝试了这个
Google Codejam Africa问题(比赛已经完成,我只是为了提高我的编程技巧).
样本输入: 3 3 1 2147483647 2147483647 5 3 4 7 4 3 5 2 10 2 10 5 样本输出: Case #1: 1 Case #2: 7 Case #3: 5 这是我提出的解决方案: with open('A-large-practice.in') as f: lines = f.readlines() with open('A-large-practice.out','w') as output: N = int(lines[0]) for testcase,i in enumerate(range(1,2*N,2)): G = int(lines[i]) for guest in range(G): codes = map(int,lines[i+1].split(' ')) alone = (c for c in codes if codes.count(c)==1) output.write("Case #%d: %dn" % (testcase+1,alone.next())) 它使用large input在我的机器上运行12秒. 现在,我的问题是,这个解决方案可以在Python中改进,以便在更短的时间内运行或使用更少的内存吗?该问题的analysis提供了一些关于如何在Java和C中执行此操作的指示,但我无法将这些解决方案转换回Python. 编辑: 结合Alex Martelli和IVlad的提示我现在有这个解决方案,运行在0.079s: with open('A-large-practice.in') as f: lines = f.readlines() with open('A-large-practice.out',2)): codes = map(int,lines[i+1].split(' ')) alone = 0 for c in codes: alone ^= c output.write("Case #%d: %d" % (testcase+1,alone)) 解决方法
我不知道python,但问题本身是经典的.给定2K-1个数字,除了一个出现偶数次的数字,找到一个出现奇数次的数字.
需要的公式: 对于所有x,> x xor x == 0 所以xor所有数字. xor-ing所有数字的结果将是你的答案.我不知道你在python中是怎么做的,在C语言中xor运算符是^. 这实际上是最有效的方法,因为您只进行简单的按位操作,甚至不需要存储给定的数字. 你可以检查:3 ^ 4 ^ 7 ^ 4 ^ 3 == 7,2 ^ 10 ^ 2 ^ 10 ^ 5 == 5等 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |