面试100题-3

一.题目:写一个函数,要求实现两个整数之和,函数体内不得使用+-*/运算

我的思路:首先想到的是异或操作,也大概知道应该是要记录进位,然后将这个进位逐步相加,但是相加的时候怎么不用运算实现呢,到这里思路直接卡死。

分析:1,想法不全面,完整的思路应该是排除基本运算之后,想到的是位运算,再细化之后才是异或操作

      2. 有进位这一点想到了,但是进位之后相加的这个结果怎么实现没有想到

      3. 卡死的地方其实很显然,又回到了题目的要求,没有想到其实是一个递归的求解过程

 

正确的想法应该是:按照计算机内部寄存器之间完成加法的思路,首先两个数只完成异或运算

然后因为只有1和1相加才会有进位,变成2(10),所以是两数相与,然后左移一位

最后将第一步和第二步的结果重新作为参数递归调用函数来实现

 

代码如下:

  
  
  
  
  1. int AddNumber(int num1, int num2) { 
  2.  
  3.     if(num2 == 0) 
  4.         return num1; 
  5.     if(num1 == 0) 
  6.         return num2; 
  7.  
  8.     int temp1 = num1 ^ num2; 
  9.     int temp2 = (num1 & num2) << 1; 
  10.  
  11.     return AddNumber(temp1, temp2); 
  12. }  

 

总结:如果面试中遇到这样的题,一是应该注意表达自己的思路,尽可能的提出自己的想法

      二是如果遇到思路卡死,应该朝着循环或者是递归的方面去思考

      三是在写代码的时候不要忘记边界条件和各种异常情况的影响

 

二:一道智力题

 

一共有9个小球,其中8个的质量相同,剩余一个的质量较重一些,怎样使用天平称两次,找出那个重量不一样的小球。

 

开始的思路是这样,4个小球一组,分成两组,剩余一个小球空出,称重。

如果天平一致,则剩余小球就是要找的球,一次搞定;如果不一致,则要找的小球在天平

比较重的4个小球之中,再分两组。。。。这样的话不能满足两次找到,至少需要3次了

 

正确的解法:以3为基准数,分3组,每一组3个小球,先在天平上称两组,如果一致

则将刚才没有称的3个小球选两个放在天平上再称,如果一致,则剩下的就是要找的

如果不一致,则重的小球是要找的;

 

如果一开始不一致,则必在重的那3个小球之中,同上面的第二步

 

总结:1.如果开始的分组数目有问题,应该及时调整,尝试其他的分组方法

      2.不要总是定势的从2,4这些数目开始,要根据题目的情况结合实际分析

 

 

 

你可能感兴趣的:(面试)