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;
    }

      

  • 相关阅读:
    HDU 5492 Find a path
    codeforce gym 100548H The Problem to Make You Happy
    Topcoder SRM 144 Lottery
    codeforce 165E Compatible Numbers
    codeforce gym 100307H Hack Protection
    区间DP总结
    UESTC 1321 柱爷的恋爱 (区间DP)
    HDU 4283 You Are the One (区间DP)
    HDU 2476 String painter (区间DP)
    UESTC 426 Food Delivery (区间DP)
  • 原文地址:https://www.cnblogs.com/hitwtx/p/2152867.html
Copyright © 2011-2022 走看看