一些看起來簡單做起來難的程式設計師筆試面試題集錦

OpenSoucre發表於2014-09-04

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, ?:.

 

相關文章