好未来笔试第二题

好未来第二题,最后9点0几调通了,结果回来一看结束了,说好的延长10分钟呢。。
题目:给定式子x y=x|y
输入x,k
输出满足式子的第k个y值。

大概思路:将k的二进制位依次次放到x为零的位置,然后与x异或得到结果。
我的想法是:假设y满足条件,那么y的二进制位上为1的地方,对应的x的位置一定是0;
求第k个满足条件的y,相当于把x为0的位置提取出来组成数字k。(二进制组成)
比如x=4 ,求第1个,就是把4(100)最后一个0提取出来,放进数字1,就得到101,然后101^100=1;
求第2个,就是把4(100)最后2个0提取出来,放进数字2(10),就得到110,然后110^100=2;
求第3个,就是把4(100)最后3个0提取出来,放进数字3(11),就得到111,然后111^100=3;
求第4个,就是把4(0100)最后3个0提取出来,放进数字4(100),就得到1100,然后1100^100=8;
。。。
那么求第k个,就直接把k按二进制的位数依次放到x为0的位置。再与x异或就得到了第k个满足条件的值。

#include <string>
#include <vector>
#include <iostream>
#include <unordered_map>
#include <algorithm>
#include <map>

using namespace std;
unsigned long long helper(unsigned long long  x, unsigned long long k);
int main()
{
int T = 0;
cin >> T;
unsigned long long  x = 0;
unsigned long long k = 0;
for (int i = 0; i < T; i )
{
cin >> x>>k;
cout<<helper(x, k)<<endl;

}

system("pause");
}
unsigned long long helper(unsigned long long  x,unsigned long long k)
{

unsigned long long x1 = x;
unsigned long long x2 = x;
vector<int> data;
while (k)
{
int tmp = k & 1;
data.push_back(tmp);
k=k >> 1;
}
int count = 0;
int p =0;
while (true)
{
if ((x1 & 1) == 0)
{
unsigned long long tp = data[p];
if (tp == 1)
{
tp = tp << count;
x = x|tp;
}
p ;
if (p==data.size())break;
}
x1 = x1>>1;
count ;
}
unsigned long long res = x^x2;
return res;

}
难受。。最后没提交


#好未来##题解##笔试题目#
全部评论
可以解释下你的思路吗?感觉好难懂啊!
点赞 回复 分享
发布于 2018-08-28 21:35
大佬,这个题ac了?
点赞 回复 分享
发布于 2018-08-28 21:56
目前看到的解释的很清楚的一个啦
点赞 回复 分享
发布于 2018-08-29 17:19

相关推荐

11-14 13:14
门头沟学院 Java
问redis常用命令问大key怎么解决问redis持久化方式,过期策略,内存淘汰策略java问接口和抽象类的区别lamda表达式线程池让我写排序的lamda,stream,然后写线程池打印线程看起来已经挂了,lamda写不出来,不会用stream处理集合,被看出基础不牢,平常不经常写代码。面试官问了很多基础的东西,redis常用命令我没说出来,因为项目很久之前做的,而且用的java客户端,自己也没有刻意去记过,面试脑子也抽了,只说了get一个key这种命令。最近有一些新反思,就是做的项目并不完善&nbsp;,有时候面试的时候不能够自圆其说,归根结底是跟着学的这些项目所采用的方案可能本来就是不对的,后续还需要继续完善一下项目。面试的时候问了面试官,像他们平时如何确定技术方案,他给了一些答案,说是会搜索,靠经验,有些场景是类似的,他们还会开技术评审,就是大家一起讨论。如果确定不下来,或许需要试验一下,这样可不可行。面试官还给了一些建议,让我看看源码,学习设计模式,设计模式是会用到的。后面说我的基础不是很好(我觉得这是我不经常写代码导致的,他问接口和抽象类的时候,我漏说了接口可以多实现,抽象类只能单继承被点出来了,他说如果多看看代码可能会有比较深刻的理解)。虽然挂了,也给了我一点继续学习的方向吧,试着多写代码,思考业务逻辑,解决方案,把基础也打牢,不要再出现redis常见命令说不出来这种情况。
查看7道真题和解析
点赞 评论 收藏
分享
点赞 7 评论
分享
牛客网
牛客企业服务