一般的编程题,注意考虑边界情况和各种约束的完备性,详情见测试用例

1 class BinaryCode: 2 3 def decode(self, message): 4 enc = [int(ch) for ch in message] 5 return (self._decodeBy(enc,0), self._decodeBy(enc,1)) 6 7 def _conact(self, nlist): 8 s = '' 9 for i in nlist: 10 s = s + str(i) 11 return s 12 13 def _get(self, a, i): 14 if 0 <= i < len(a): 15 return a[i] 16 else: 17 return 0 18 19 def _decodeBy(self, enc, first): 20 ori = [first] 21 for i in range(1, len(enc)): 22 x = enc[i-1] - self._get(ori,i-1) - self._get(ori,i-2) 23 if not x in [0, 1]: 24 return 'NONE' 25 ori.append(x) 26 27 if enc[-1] != self._get(ori, len(ori)-1) + self._get(ori, len(ori)-2): 28 return 'NONE' 29 30 return self._conact(ori) 31 32 # test 33 o = BinaryCode() 34 35 # test: len(message) = 1 36 assert(('0', 'NONE') == o.decode("0")) 37 38 # test: 最后一个数的推导受到2个条件的约束, 是否都进行了验证 39 assert(('NONE', 'NONE') == o.decode("112")) 40 41 # test: 是否每个数都进行了01验证 42 assert(('NONE', 'NONE') == o.decode("932")) 43 44 # test case 45 assert(( "011100011", "NONE" ) == o.decode("123210122")) 46 assert(( "01", "10" ) == o.decode("11")) 47 assert(("NONE", "NONE") == o.decode("123210120")) 48 assert(("NONE", "NONE") == o.decode("3")) 49 assert(("01101001101101001101001001001101001", 50 "10110010110110010110010010010110010") == o.decode("12221112222221112221111111112221111"))