常见面试题学习(3)
来源于:
http://blog.csdn.net/lin_bei/article/details/1565575
1. 中位数,也是利用2分查找,去掉一半的算法,只是这个 中位数 。。。。总是求的是最小的那个,而不是平均值。。。
Gray 码,使用递归分治求GRAY码
硬币找零问题
#include <iostream>
using namespace std;
int findMedian(int *a,int *b,int n)
{
if(n == 1)
return *a <= *b ? *a: *b;
int m = (n - 1) >> 1;
int p = m + 1;
if(n % 2 != 0)//n 为奇数
{
p --;
}
if(*(a + m) == *(b + m))
{
return *(a + m);
}
else if(*(a + m) < *(b + m))
{
return findMedian(a+p,b,m + 1);
}
else
{
return findMedian(a,b + p,m +1);
}
}
int main()
{
int a[3] = {5,15,18};
int b[3] = {3,14,21};
int result = findMedian(a,b,3);
cout << result << endl;
return 0;
}
2. Gray 码,使用递归分治求GRAY码
http://topic.csdn.net/u/20080331/21/aabec9b7-a617-432a-9ada-a6d0823fd047.html
#include <iostream>
#include <iterator>
#include <algorithm>
using namespace std;
int *Road;
void R_Gray( int, int );
void Gray( int n, int level ){
if( level==0 ){
copy( Road, Road+n, ostream_iterator<int>(cout) ),cout<<endl;
return;
}
Road[n-level]=0;
Gray( n, level-1 );
Road[n-level]=1;
R_Gray( n, level-1 );
}
void R_Gray( int n, int level ){
if( level==0 ){
copy( Road, Road+n, ostream_iterator<int>(cout) ),cout<<endl;
return;
}
Road[n-level]=1;
Gray( n, level-1 );
Road[n-level]=0;
R_Gray( n, level-1 );
}
int main()
{
int n;
cin>>n;
Road=new int[n];
Gray( n, n );
delete []Road;
return 0;
}
还有非递归的
#include <iostream>
using namespace std;
void print_bit_model( int len, int n ){
for( int i=len-1; i>=0; --i )
cout<<((n>>i)&1);
cout<<endl;
}
int main()
{
int n;
cin>>n;
const int M=1<<n;
for( int i=0; i<M; ++i )
print_bit_model( n, i^(i>>1) );
return 0;
}
3. 硬币找零问题
动态规划
#include <fstream>
#include <iostream>
#include <algorithm>
using namespace std;
#define INT_MAX 999999
int changeCoins(int *T, int n, int v);
int main()
{
int n;
int v = 10000;
cin>>n;
int *T=new int[n];
for(int i=0;i<n;i++)
{
cin>>T[i];
}
int result=changeCoins(T,n,v);
cout<<result<<endl;
return 0;
}
int changeCoins(int *T, int n, int v)
{
//先对3个硬币按面值进行排序
sort(T,T+n);
int **c=new int*[n];
for(int m=0;m<n;m++){
c[m]=new int[v+1];
}
//初始化第一行,只有一个硬币时的情况
for(int i=0;i<=v;i++)
if(i%T[0]==0)
c[0][i]=i/T[0];
else
c[0][i]=INT_MAX;
//从第二行开始
for(int j=1;j<n;j++)
for(int k=0;k<=v;k++)
//新加进来的硬币大于要找的钱,用不到这个硬币,所以还是跟上一行的一样
if(k<T[j])
c[j][k]=c[j-1][k];
else
c[j][k]=c[j-1][k]<c[j][k-T[j]]+1?c[j-1][k]:c[j][k-T[j]]+1;
return c[n-1][v];
delete[] c;
}
一个不会敲代码的程序员