zoukankan      html  css  js  c++  java
  • 常见面试题学习(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;
    }

      

  • 相关阅读:
    Nginx负载均衡+代理+ssl+压力测试
    Nginx配置文件详解
    HDU ACM 1690 Bus System (SPFA)
    HDU ACM 1224 Free DIY Tour (SPFA)
    HDU ACM 1869 六度分离(Floyd)
    HDU ACM 2066 一个人的旅行
    HDU ACM 3790 最短路径问题
    HDU ACM 1879 继续畅通工程
    HDU ACM 1856 More is better(并查集)
    HDU ACM 1325 / POJ 1308 Is It A Tree?
  • 原文地址:https://www.cnblogs.com/hitwtx/p/2152867.html
Copyright © 2011-2022 走看看