|
发表于 2020-4-4 10:51:03
|
显示全部楼层
本帖最后由 阴阳神万物主 于 2020-4-4 11:50 编辑
难度评级:普通
要素分析:规律 求反
代码:
- def solve(n:int,k:int)->int:
- if n<1 or k<1 or k>2**(n-1):
- raise IndexError('parameter index out of range')
- def re(l):
- return [not i for i in l]
- l = [0]
- for i in range(1,n):l.extend(re(l))
- return int(l[k-1])
- if __name__ == '__main__':
- print('示例1 输出:',solve(1,1))
- print('示例2 输出:',solve(2,1))
- print('示例3 输出:',solve(2,2))
- print('示例4 输出:',solve(4,5))
复制代码
当输入不合法的时候,我抛个异常应该不算错吧?
本来吧,我是想用整数的按位求反~的,但是吧,整数的按位求反的位数是恒定的,于是就会出现对补码的求反,导致结果与预期不同。不晓得有没有能够达到效果的BIF.
ps:之前没有调试,函数打错了
上面是顺推,超时,下面是逆推,极快:
- def solve(n:int,k:int)->int:
- if n<1 or k<1 or k>2**(n-1):
- raise IndexError('parameter index out of range')
- flg = 0
- for i in range(n-2,0,-1):
- d = divmod(k,2**i)
- if d[0] < 2 and d[1]:
- flg,k = flg+d[0],d[1]
- else:
- k //= d[0]
- if d[0] > 1:flg += 1
- return [1,0][k-1] if flg%2 else [0,1][k-1]
- if __name__ == '__main__':
- print('示例1 输出:',solve(1,1))
- print('示例2 输出:',solve(2,1))
- print('示例3 输出:',solve(2,2))
- print('示例4 输出:',solve(4,5))
复制代码 每一行对半分,右边是左边的按位取反,而左边正是上一行的内容,在n=2时有且仅有0和1各一个。当n<=2时若k的取值合法,则在第2行的索引就是k-1且无需求反。
|
评分
-
查看全部评分
|