C++程序 检查两个数字是否是彼此的位旋转
给定两个正整数x和y,检查一个整数是否是通过旋转另一个整数的位得到的。
输入限制: 0 < x,y < 2^32
位旋转: 旋转(或循环移位)是类似于移位的操作,但是一个端掉落的位被放回到另一端。
有关位旋转的更多信息,请参见 here。
示例1:
输入 :a = 8,b = 1
输出:是的
说明。
a的表示方法= 8:0000 0000 0000 0000 0000 0000 0000 1000
b的表示方法=1:0000 0000 0000 0000 0000 0000 0000 0001
如果我们将a向右旋转3个单位,则会得到b,因此答案是yes
示例2:
输入 :a = 122, b = 2147483678
输出 :是的
说明
a的表示方法= 122:0000 0000 0000 0000 0000 0000 0111 1010
b的表示方法= 2147483678:1000 0000 0000 0000 0000 0000 0001 1110
如果我们将a向右旋转2个单位,则会得到b,因此答案是yes
由于x或y可以表示的总位数为32,因为x,y>0且x,y<2^32。
因此,我们需要找到x的所有32个可能的旋转并将其与y进行比较,直到x和y不相等为止。
为此,我们使用具有64位的临时变量x64,它是x与x相连接的结果即:
x64具有首32位与x的位相同,最后32位与x64的位相同。
然后,我们将x64不断向右移动1个单位,并将x64的最右边的32位与y进行比较。
以这种方式,我们将能够获取由于旋转而产生的所有可能的位组合。
下面是上述算法的实现。
输出
时间复杂度: O(log 2 n),其中n是给定数字
辅助空间: O(1)