給定 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,就能夠保證按位或運算與加運算結果相同。
於是上**–
# -*- 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 n0for i in range(buwei-1,-1,-1):
result=k_str[i]+result
#補位print(eval('0b'+result))
#0b表示二進位制數
寫for迴圈的時候字串反向遍歷各種暈,好幾次寫著寫著就分不清 今日頭條筆試
問題描述 給定乙個段落,由 n 個句子組成。第 i 個句子的長度為 l i 包含的單詞個數為 w i 句子不包含任何除字母和空格 外的符號。每個句子內部,含有若干個單詞,由空格 分隔。句子不會包含連續的空格。隨後給定 m 個查詢,每個查詢包含乙個句子,需要在段落中尋找相同單詞數量最多的句子。重複的單...
2017 08 22 今日頭條筆試題
有乙個值得分享的地方,是x排序之後對應y的問題 我用了乙個很大的陣列,以x為索引,y為陣列值,不需要用到map。其實也是因為我懶不想去學map操作了,下次試試用map。include include include using namespace std int main cin n x.clear...
今日頭條筆試題(一)
一列火車有n個車廂標記為1,2,3,4,5,6 n 現在因為某些原因,需要調整車廂的相對順序 例如需要將車廂順序調整為2,3,1,4,5,6 n 由於車廂龐大,且車廂只能停留在鐵軌上,所以不能隨心所欲的調整相對順序 現在只能利用兩條並行的鐵軌對車廂的順序進行調整 例如原序列為1,2的車廂 車廂1進入...