常见面试题学习(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;
}

  

posted @ 2011-08-25 10:03  wtx  阅读(246)  评论(0编辑  收藏  举报