C++笔试面试(算法题集一)

来源:互联网 发布:全民k歌刷花软件 编辑:程序博客网 时间:2024/04/30 13:24

1>你让一些人为你工作了七天,你要用一根金条作为报酬。金条被分成七小块,每天给出一小块。如果你只能将金条分割两次,你怎样分给这些工人?

解答:将金条分割成1+2+4.这样这三个数字将可以组成1-7的任何数字。

 

2->用一种算法来颠倒一个链表的顺序。

解答:递归的解法:

Node *Reverse(Node *head)

{

    if(head==NULL) return head;

    if(head->next==NULL) return head;

    Node *p=Reverse(head->next);

    head->next->next=head;

    head->next=NULL;

    return p;

}

非递归算法:

Node *ReverseNonRecurisve(Node *head)

{

    if(head==NULL)  return head;

    Node *p=head;

    Node* pre=NULL;

    while(p->next!=NULL)

    {

        Node *pNext=p->next;

        p->next=pre;

        pre=p;

        p=pNext;

    }

    p->next=pre;

    return p;

}

 

3>算法通用字符串匹配

解法:

int match(char *str,char *ptn)

{

    if(*ptn=='\0') return 1;

    if(*ptn=='*')

    {

        do{

             if(match(str++,ptn+1))  return 1;

        }while(*str!='\0');

    }

    if(*str=='\0')  return 0;

    if(*str==*ptn || *ptn=='?')

          return match(str+1,ptn+1);

    return 0;

}

 

4>比较两个字符串,用O(n)时间和恒量空间

解答:

int strcmp(char *p1,char *p2)

{

    while(*p1!='\0' && *p2!='\0' &&*p1==*p2)

    {

        p1++;

        p2++;

    }

    if(*p1=='\0' &&*p2=='\0')    return 0;

    if(*p1=='\0')  return -1;

    if(*p2=='\0')  return 1;

    return (*p1-*p2);

}

 

5>不用乘法或者加法增加8倍。用类似的方法增加7倍。

解答:n<<3       (n<<3)-n

 

6>判断整数序列是不是二叉树的后序遍历结果。

输入一个整数数组,判断该数组是不是某二元查找树的后序遍历结果。

解答:

void isPostorderResult(int a[],int left,int right,bool &flag)

{

    if(flag &&left<right)

    {

        int i=left;

        while(a[right]>a[i])  i++;

        for(int j=i;j<right;j++)

        {

             if(a[j]<a[right]) {flag=false; return;}

        }

        IsPosterResult(a,left,i-1,flag);

        IsPosterResult(a,i+1,right,flag);

    }

}

 

7>求二叉树中节点的最大距离(距离定义为两个节点之间边的个数)

解答:

int maxDistance(Node *root){

    int depth;

    return helper(root,depth);

}

int helper(Node* root,int &depth)

{

    if(root==NULL){

        depth=0; return 0;

    }

    int l,r;

    int maxleft=helper(root->left,l);

    int maxright=helper(root->right,r);

   depth=max(l,r)+1;

   return max(maxleft,max(right,l+r)); 

}

 

8>在一个字符串中找到第一个只出现一次的字符。例如输入abaccdeff,则输出b。

解答:

char FirstSingle(char *str)

{

    int c[255];  memset(c,0,sizeof(c));

    char *p=str;

    while(*p!='\0')

    {

        c[*p]++;

         p++;

    }

    p=str;

    while(*p!='\0'){

        if(c[*p]==1)    return *p;

    }

    return '\0';

}

0 0
原创粉丝点击