题目链接codewars网站:
题目大意
通常的二进制是用0和1来进行编码和解码的,但是本题希望能够只用0来表示。在用0进行编码的时候,需要遵守的规则有以下几点:
- 字符信息都要用七位二进制来表示(未满7位的要补满)
- 连续相同的数字为有两部分组成,前一部分为数字的种类,后一部分为这个连续数字的长度个0构成
- 各个部分都要用空格来分割
- 数字的种类:0 用 00表示,1用0表示
本题要我们写两个函数,send(s)和receive(s)
例子:
send(“C”)->“0 0 00 0000 0 00”
receive(“0 0 00 0000 0 00”)->“C”
我的分析
因为我做这种练习是为了蓝桥杯准备的,所以在考虑的时候,我尽量不去使用第三方库。对于我而言,send函数更加费脑子一点,当你把它转换为七位二进制后,要怎么去数出对应的0和1的个数呢。
我是用了old和new这两个参数,来进行对照,如果相同就保存,不同就给他输出。开始我并没有注意到一定要七位二进制。
后来写receive函数时,发现是给我们降低了难度。
直接看代码吧,注释的应该很详细了。
我的代码
def send(s):
num=''
out=''
mid=''
for i in s:#将字符转换为七位二进制并保存在num中
l=bin(ord(i))[2:]
if len(l)<7:
l='0'*(7-len(l))+l
num=num+l
old=num[0]
for new in num:
if old!=new:#当old和new不一样的时候,就把mid中的字符转换到out里面
if old=='1':
out+='0 '+'0'*len(mid)+' '
else:
out+='00 '+'0'*len(mid)+' '
mid=''
mid+=new
old=new
return out+'0 '+'0'*len(mid) if old=='1' else out+'00 '+'0'*len(mid) #因为最后一次的mid没有输出,手动给他输出,当然我是懒得再想了,应该还有好方法的
def receive(s):
l=s.split(' ')
mid=''
out=''
for i in range(0,len(l),2):
if l[i]=='0':
mid+='1'*len(l[i+1])
else:
mid+='0'*len(l[i+1])
for i in range(0,len(mid),7):
out+=chr(int(mid[i:i+7],base=2))
return out
当然后续我看了以下其他人的代码,很多都是用了正则表达式,代码也确实简洁了很多,大家如果感兴趣也可以自己去写写看。