程序员面试金典84题之每日7题 - 第五天

第一题:整数转化

题目:

编写一个函数,确定需要改变几个位,才能将整数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;
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值