好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

华为腾讯爱立信笔试面试题.docx

10页
  • 卖家[上传人]:碎****木
  • 文档编号:234647741
  • 上传时间:2022-01-04
  • 文档格式:DOCX
  • 文档大小:13.48KB
  • / 10 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 2009 爱立信,华为,腾讯,笔试面试题1.用最简单的方法判断一个数是否为 2 的幂(华为笔试) 最开始以为是编程题就写了个函数:bool f(int x){while(x%2==0) //判断是否为奇数x/=2; //为追求效率可以用x>>=1 return !(x>1);}为了追求更高点点的效率可以把除法运算用右移代替,判断用位运算代替,就有下面代码:bool f(int x){while((x&1)==0)//就是判断x 的末位是否为 1 x>>=1;return !(x>1);}后来发觉这题其实有更简单的方法,请看下面问题:如何求一个数的二进制表示中 1 的个数? int func(x){int count=0; while(x){count++;x+=x&(x-1);//这个操作能使 x 的二进制表示中的 1 的个数减 1}return count;}这样判断一个数是不是 2 的幂代码就很简单了:(也就是判断它里面只有一个 1,哈哈)bool f(int x){return !(x&(x-1));}2 字符串逆置(腾讯面试)题目本身简单,但是有的是要求不能 malloc 新的内存空间,这样的话你就得在原来的串上进行操作就像下面的代码:void reverse(char* ch){int i, len; char tmp;len = strlen( ch );for{( i= 0; i < len / 2; i++ )tmp= ch[ i ];ch[i ] = ch[ len - i - 1 ];ch[len - i - 1 ] = tmp;}}有的则是要求逆置到另外一段内存空间里,这样你就需用 malloc 了,而且注意函数的声明形式:如果用纯 c 语言,恭喜你,你得用到指针的指针了: int reserve(char** a, char** b)//返回值代表操作成功与否c++的话就可以用引用:int reserve(char*& a, char*& b)3 背包问题、约瑟夫问题、有序表合并(华为第 4 面机测)从一摞摞数里比如从 20 个数{12,24,22,58,47,11,19,28, 33,67,81,34,27,41,50,36,88,51,21,14}中挑选出若干个数使它们的和等于 100.输出所有可能的选法。

      解法:20 个数放到a[20]数组里,然后b[20]数组里面放 0 或者1.然后再sum=a[0]*b[0]+a[1]*b[1]+...+a[19]*b[19] 当b=1 时,说明下标为 i 的那个数a 被选中了,否则说明 a 这个数没有被选中于是用一个20 位的二进制数k 来表示b[]数组,然后将k 从0...0(20 个 0)到 1...1(20 个 1)遍历一遍(for 循环),穷举出所有解法代码如下:#include using namespace std; const int N=20; const int M=100; void main(){int a[N]={12,24,22,58,47,11,19,28,33,67,81,34,27,41,50,36,8 8,51,21,14};int b[N];//放的 0,1... int c[N];//掩码int k,sum;//下面是让c 里面保存的数第i 位为 1, 其他位都为 0c[0]=1;for (int i=1;i0;k--){sum=0;for (int j=0;j0)?1:0;sum+=a[j]*b[j];}if (sum==M){cout<<"以下数字相加和为"<hello();}事实是输出了 hello,虽然在调用 p->hello();之前已经给 p 赋值为NULL 了(即 0 值),但是p 依然可以调用 test 类的函数。

      我对此的解释是只要是 test 类的成员函数和成员变量放在不同的存储区(事实上也是如此),只要是 test 类型的指针就能调用 test 的成员函数,前提是函数里没有涉及到成员变量比如下面的代码编译无误但运行会报错:#include "stdio.h" class test{private:int i; public: test(){i=1;}void hello(){printf("%d\n",i);}};void main(){test* p=new test();p=NULL;p->hello();}如果将p=NULL 注释掉就无误,就会输出 1.注意:另外上面两个例子中如果把 p=NULL 换成 delete p;也会有相似地效果,第一个依然输出 hello,第二个输出个随机值(不报错)大家不妨调试看看1) C++的构造以及析构顺序#include using namespace std; class A{public: A(){cout<<"A"<

      这里要注意几点的是:首先, A*类型的指针不能赋给 B*类型指针(强制转换也不行),不过有两个例外,一个是 void*指针, 另一个是当A 和 B 有继承关系时其次只能将子类类型指针赋值给父类(上转型),而不能将父类对象地址赋给子类指针,因为子类默认包含了父类的所有成员(当然有些被隐藏,呵呵)(2) 面试的诡异题目大意就是如果你 test *p=new test[20];然后释放的时候用 delete p; 会怎样?(明显这样做是不对滴……)答复是会调用 p[0]的析构函数,然后 p[1]到 p[19]没人管另外还问是否造成内存泄露……。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.