您的位置:首页 > 职场人生

一些看起来简单做起来难的程序员笔试面试题集锦

2014-09-04 11:39 288 查看
1、判断三个bool值中是否至少有两个bool为真?

  此题有几种不同的解法

  (1)传统解法

bool leastTwo(bool a, bool b, bool c){
return (a&&b) || (b&&c) || (c&&a);
}


  (2)如果学过电路的可以考虑利用卡诺图化简

return a?(b || c) : (b && c);


  或者

return a && (b || c) ||(b && c);


  (3) 使用异或运算 true ^ true = false; true^false = true; false^true = true; false^false = false;

return a^b ? c : a;


  (4)计数true的个数

return ((a?1:0)+(b?1:0)+(c?1:0)) >= 2;


2、通过增加或是修改一个字符,是下面c程序输出20个减号

int n = 20;
for(int i = 0; i < n ; i --){
printf("-");
}


此题主要考虑for循环的使用功底,由于输出20个减号,大致的程序都不变,要考虑怎么从for括号的循环条件修改

for(int  i = 0 ; -i < n; i --)

for(int i = 0 ; i < n ; n--)

for(int i = 0 ; i +n ; i -- )


3、不用任何循环语句和条件语句,打印1到100的数

  此题首先想到的是递归,但递归不是面试官想要的,面试官肯定会接着问 “还有其他方法吗?”

  (1)利用构造函数实现,生成100个对象,即可以打印100次。

class Printer
{
public:
Printer() { static unsigned i=1; cout << i++ << endl; }
};

int main()
{
Printer p[100];
}


  (2)利用模板特化的性质实现。

template <int N>
struct Print{
static void print(){
Print<N-1>::print();
printf("%d\n",N);
}
}

template <>
struct Print<1>{
static void print(){
printf("1\n");
}
}


  类似题目:求1+2+……+n,要求不能用以下符号:*, /, for, while, if, else, switch, case, ?:.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: