或與加(今日頭條筆試)

2021-08-08 17:07:41 字數 1404 閱讀 9502

給定 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進入...