第一题:整数转化
题目:
编写一个函数,确定需要改变几个位,才能将整数A转变成整数B。
给定两个整数int A,int B。请返回需要改变的数位个数。
测试样例:
10,5
返回:4
解析:
求t的二进制有几个1,可用
while (t) {
++count;
t = t & (t - 1);
}
class Transform {
public:
int calcCost(int A, int B) {
// write code here
int t = A ^ B;
int count = 0;
while (t) {
++count;
t = t & (t - 1);
}
return count;
}
};
第二题:奇偶位交换
题目:
请编写程序交换一个数的二进制的奇数位和偶数位。(使用越少的指令越好)
给定一个int x,请返回交换后的数int。
测试样例:
10
返回:5
解析:
用0xAAAAAAAA与x相与求的奇数位上数字(偶数位上数字为0)
用0x 55555555 与x相与求的偶数位上数字(奇数位上数字为0)oddVal右移一位 even左移一位 相加即可。
class Exchange {
public:
int exchangeOddEven(int x) {
// write code here
int valeven = x & 0x55555555;
int valodd = x & 0xAAAAAAAA;
return (valeven << 1) + (valodd >> 1);
}
};
第三题:找出缺失的整数
题目:
数组A包含了0到n的所有整数,但其中缺失了一个。对于这个问题,我们设定限制,使得一次操作无法取得数组number里某个整数的完整内容。唯一的可用操作是询问数组中第i个元素的二进制的第j位(最低位为第0位),该操作的时间复杂度为常数,请设计算法,在O(n)的时间内找到这个数。
给定一个数组number,即所有剩下的数按从小到大排列的二进制各位的值,如A[0][1]表示剩下的第二个数二进制从低到高的第二位。同时给定一个int
n,意义如题。请返回缺失的数。
测试样例:
[[0],[0,1]]
返回:1
解析:
class Finder {
public:
int findMissing(vector<vector<int> > numbers, int n) {
// write code here
if(n<0)return 0;
for(int i=0;i<n-1;i++)
{
if(numbers[i][0]==numbers[i+1][0])
{
return i+1;
break;
}
}
return n;
}
};
第四题:像素设定
题目:
有一个单色屏幕储存在一维数组中,其中数组的每个元素代表连续的8位的像素的值,请实现一个函数,将第x到第y个像素涂上颜色(像素标号从零开始),并尝试尽量使用最快的办法。
给定表示屏幕的数组screen(数组中的每个元素代表连续的8个像素,且从左至右的像素分别对应元素的二进制的从低到高位),以及int
x,int y,意义如题意所述,保证输入数据合法。请返回涂色后的新的屏幕数组。
测试样例:
[0,0,0,0,0,0],0,47
返回:[255,255,255,255,255,255]
解析:
class Render {
public:
vector<int> renderPixel(vector<int> screen, int x, int y) {
// write code here
for(int i = x ; i <= y ; i ++)
{
int k = i % 8 ;
int t = i / 8 ;
screen[t] = screen[t] | (1<< k);
}
return screen ;
}
};
第五题:碰撞的蚂蚁
题目:
在n个顶点的多边形上有n只蚂蚁,这些蚂蚁同时开始沿着多边形的边爬行,请求出这些蚂蚁相撞的概率。(这里的相撞是指存在任意两只蚂蚁会相撞)
给定一个int n(3<=n<=10000),代表n边形和n只蚂蚁,请返回一个double,为相撞的概率。
测试样例:
3
返回:0.75
解析:
所有蚂蚁往左边或者往右边爬,这样才不会遇到
class Ants {
public:
double antsCollision(int n) {
// write code here
return 1 - 2 * pow(0.5, n);
}
};
第六题:判断直线相交
题目:
给定直角坐标系上的两条直线,确定这两条直线会不会相交。
线段以斜率和截距的形式给出,即double s1,double s2,double y1,double
y2,分别代表直线1和2的斜率(即s1,s2)和截距(即y1,y2),请返回一个bool,代表给定的两条直线是否相交。这里两直线重合也认为相交。
测试样例:
3.14,3.14,1,2
返回:false
解析:
注意:double类型判等应该使用<某一精度值
class CrossLine {
public:
bool checkCrossLine(double s1, double s2, double y1, double y2) {
// write code here
if (abs(s1 - s2) < 1e-6) {
if (abs(y1 - y2) > 1e-6)
return false;
}
return true;
}
};
第七题:加法运算替代
题目:
请编写一个方法,实现整数的乘法、减法和除法运算(这里的除指整除)。只允许使用加号。
给定两个正整数int a,int b,同时给定一个int type代表运算的类型,1为求a * b,0为求a / b,-1为求a -
b。请返回计算的结果,保证数据合法且结果一定在int范围内。
测试样例:
1,2,1
返回:2
解析:
减法这里有问题
class AddSubstitution {
public:
int calc(int a, int b, int type) {
// write code here
int res = 0;
if (type == 1) {
while (b) {
res += a;
--b;
}
}
else if (type == 0) {
if (a < b) {
res = 0;
}
else
{
int sum = b+b;
int count = 1;
while (sum <= a) {
++count;
sum += b;
}
res = count;
}
}
else if (type == -1) {
res = a + (-b);
}
return res;
}
};