在IT企業面試中往往會讓你手寫一段代碼,然後討論,其實一般的代碼都不是很難,但是技巧性較強,所以很多同學心中有點犯怵,其實大可不必,在準備面試前自己多寫寫基本思維的代碼,對面試還是有好處的。自己也要找工作,所以將一些比較重要的問題,拿出來更大家一起曬曬,共同進步!
問題一:基本的階乘-遞歸問題
基本模式:
#include <stdio.h>
int Factorial(int n)
{
if(1==n)
return 1;
else
return Factorial(n-1)*n;
return 0;
}
int main()
{
int num = Factorial(10);
printf("%d\n",num);
return 0;
}
但是往往,階乘都比較大,所以建議使用這樣的方式,這樣面試官會知道你是基本還是瞭解一點程序可能出現的錯誤,所以不妨將int換成long,這樣表示的範圍比較大,但是對於大的階乘貌似就不太好了!
#include <stdio.h>
long Factorial(long n)
{
if(1==n)
return 1;
else
return Factorial(n-1)*n;
return 0;
}
int main()
{
long num = Factorial(10);
printf("%ld\n",num);
return 0;
}
其實同學們也可以使用非遞歸的形式解決這個問題,但是也會有同樣的問題,就是會很容易的超出int表示的範圍
long Factorial_NR(long n)
{
long sum = 1;
while(n>0)
sum *= n--;
return sum;
}
其實,這些算法就是最基本的算法,在後續的文章中,我會寫一寫關於大數的一些基本操作,那個纔是在實際工程中需要的真正算法!
問題二:多重循環簡化問題
編程實現,一個射擊運動員連開十槍最後恰好打中九十環的可能性?
解答:
其實,這個問題可以使用多重循環解決問題, 但是如果你這樣給面試官寫出這個問題的時候,估計你也離這個公司漸行漸遠了。我們要好好分析,情況成立的可能條件,和不可能條件,使用剪枝算法可以將一些無用的運算直接刪除。
每一槍可以打0-10換,共11種可能:
1.當你的現在得分在很少,即使後面每一環都打10環也不可能得到90環,所以這種情況下就直接退出;
2.如果滿足條件且打到最後一次;
3.讓每次都嘗試的打中每種可能,這樣就可以遍歷所有的可能;
看源代碼如下:
#include <iostream>
using namespace std;
int sum=0,store[10];
void OutPut()
{
for(int i=9;i>=0;i--)
cout << store[i] << " ";
cout << endl;
sum++;
}
void Comput(int score,int num)
{
if(score < 0 || score > (num+1)*10)
return ;
if(0==num)
{
store[num] = score;
//OutPut();
sum++;
return ;
}
for(int i=0;i<11;i++)
{
store[num]=i;
Comput(score-i,num-1);
}
}
int main()
{
Comput(90,9);
cout << "Total Number is: " << sum << endl;
return 0;
}
將輸出信息全部屏蔽掉,這樣可以讓執行速度提高很多!