一.题目:写一个函数,要求实现两个整数之和,函数体内不得使用+-*/运算
我的思路:首先想到的是异或操作,也大概知道应该是要记录进位,然后将这个进位逐步相加,但是相加的时候怎么不用运算实现呢,到这里思路直接卡死。
分析:1,想法不全面,完整的思路应该是排除基本运算之后,想到的是位运算,再细化之后才是异或操作
2. 有进位这一点想到了,但是进位之后相加的这个结果怎么实现没有想到
3. 卡死的地方其实很显然,又回到了题目的要求,没有想到其实是一个递归的求解过程
正确的想法应该是:按照计算机内部寄存器之间完成加法的思路,首先两个数只完成异或运算
然后因为只有1和1相加才会有进位,变成2(10),所以是两数相与,然后左移一位
最后将第一步和第二步的结果重新作为参数递归调用函数来实现
代码如下:
- int AddNumber(int num1, int num2) {
- if(num2 == 0)
- return num1;
- if(num1 == 0)
- return num2;
- int temp1 = num1 ^ num2;
- int temp2 = (num1 & num2) << 1;
- return AddNumber(temp1, temp2);
- }
总结:如果面试中遇到这样的题,一是应该注意表达自己的思路,尽可能的提出自己的想法
二是如果遇到思路卡死,应该朝着循环或者是递归的方面去思考
三是在写代码的时候不要忘记边界条件和各种异常情况的影响
二:一道智力题
一共有9个小球,其中8个的质量相同,剩余一个的质量较重一些,怎样使用天平称两次,找出那个重量不一样的小球。
开始的思路是这样,4个小球一组,分成两组,剩余一个小球空出,称重。
如果天平一致,则剩余小球就是要找的球,一次搞定;如果不一致,则要找的小球在天平
比较重的4个小球之中,再分两组。。。。这样的话不能满足两次找到,至少需要3次了
正确的解法:以3为基准数,分3组,每一组3个小球,先在天平上称两组,如果一致
则将刚才没有称的3个小球选两个放在天平上再称,如果一致,则剩下的就是要找的
如果不一致,则重的小球是要找的;
如果一开始不一致,则必在重的那3个小球之中,同上面的第二步
总结:1.如果开始的分组数目有问题,应该及时调整,尝试其他的分组方法
2.不要总是定势的从2,4这些数目开始,要根据题目的情况结合实际分析
转载于:https://blog.51cto.com/6341634/1105141