或与加(今日头条笔试)
2017-09-24 21:35
369 查看
给定 x, k ,求满足 x + y = x | y 的第 k 小的正整数 y 。 | 是二进制的或(or)运算,例如 3 | 5 = 7。
比如当 x=5,k=1时返回 2,因为5+1=6 不等于 5|1=5,而 5+2=7 等于 5 | 2 = 7。
输入描述:
每组测试用例仅包含一组数据,每组数据为两个正整数 x , k。 满足 0 < x , k ≤ 2,000,000,000。
输出描述:
输出一个数y。
输入例子1:
5 1
输出例子1:
2
先是直接上穷举法,然后提示超时~ 纠结了半天终于想出来了,挺有意思的一道题。
想通按位或运算与加法运算结果相同的情况就能做了。把十进制转换成二进制来进行考虑。
5转换成101,那么对应关系
可以看出y只要在x转换成二进制后对应的1位填0,就能够保证按位或运算与加运算结果相同。
于是上代码–
写for循环的时候字符串反向遍历各种晕,好几次写着写着就分不清了
比如当 x=5,k=1时返回 2,因为5+1=6 不等于 5|1=5,而 5+2=7 等于 5 | 2 = 7。
输入描述:
每组测试用例仅包含一组数据,每组数据为两个正整数 x , k。 满足 0 < x , k ≤ 2,000,000,000。
输出描述:
输出一个数y。
输入例子1:
5 1
输出例子1:
2
先是直接上穷举法,然后提示超时~ 纠结了半天终于想出来了,挺有意思的一道题。
想通按位或运算与加法运算结果相同的情况就能做了。把十进制转换成二进制来进行考虑。
5转换成101,那么对应关系
可以看出y只要在x转换成二进制后对应的1位填0,就能够保证按位或运算与加运算结果相同。
于是上代码–
# -*- coding: UTF-8 -*- iin=input() iin=iin.split(' ') x=eval(iin[0]) k=eval(iin[1]) x_str=str(bin(x).replace('0b','')) #将输入x,k转换为二进制字符串 k_str=str(bin(k).replace('0b','')) k_len=len(k_str) n0=0 #标记x_str中有几个0 result='' #处理结果 for i in x_str: if i=='0': n0=n0+1 kflag=k_len-1 #二进制x为0的位置填入k的数值,x为1的位置填0 for i in x_str[::-1]: if i=='0': result=k_str[kflag]+result kflag=kflag-1 #kflag<0时退出循环,防止k_str[]出界 if kflag<0: break else : result='0'+result #当k所需要填的值大于二进制x拥有的0空时,往前面补位 if n0<k_len: buwei=k_len-n0 for i in range(buwei-1,-1,-1): result=k_str[i]+result #补位 print(eval('0b'+result)) #0b表示二进制数
写for循环的时候字符串反向遍历各种晕,好几次写着写着就分不清了
相关文章推荐
- 今日头条秋招前端笔试附加题解题思路
- 2017-今日头条笔试题
- 今日头条笔试题
- 今日头条笔试之字母交换
- 今日头条3月24笔试题java实现
- 2018春招-今日头条笔试题-第四题(python)
- 今日头条笔试题
- 今日头条笔试8/23第二题
- 【今日头条笔试题】找一组坐标点的右边界点
- 今日头条笔试题
- 今日头条笔试题,任务调度问题
- 2018春招-今日头条笔试题-第二题(python)
- 20170330今日头条笔试题
- 今日头条,笔试题
- 今日头条笔试题:“最小数字*区间和”的最大值【单调栈】
- [今日头条] 2017客户端工程师实习生笔试题
- 今日头条笔试【编程题 + 分析过程发现数学规律 + 回溯法】
- 2017.04.19:今日头条数据分析笔试01
- [笔试练习]今日头条实习笔试
- 今日头条笔试