面试题总结(一)

     马上又是一年一度的求职的浪潮又要袭来,作为一名即将毕业的在校生倍感压力,最近这段时间也准备了一下面试,随着复习的积累,但发现自己健忘的能力越来越强,思来想去最后还是以博客的形式将其存储起来,这样既方便于大家有空可以瞄一下,也有益于鄙人将来复习之用。当然所呈现的题目都是一些经典的面试题,对于给出的答案也都是网上曝出的经典解决方法,有些面试题不止一种解决方法,所有程序都会在自己的电脑上运行成功之后粘贴出来,当然如果是借鉴别人的算法,也会将其出处一并粘贴出来。前期集中一些有关字符串和链表的问题。

1.查找字符串中第一个只出现一次的字符

  题目叙述:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。

//查找字符串中第一个只出现一次的字符
char FirstCharOneofNum(char *str)
{
    int i,j,len;
    char c;
    int a[256] = {0};
    len = strlen(str);
    for (i = 0;i < len;i++)
    {
        a[*(str+i)] ++;
    }
    for (j = 0;j < len;j++)
    {
        if (a[*(str+j)] == 1)
        {
            c = *(str+j);
            break;
        }
    }
    return c;
}
View Code

2.逆序输出链表

题目叙述:输入一个链表的头结点,从尾到头反过来输出每个结点的值。

递归方式:

void ReverseLink(Node* node)
{
    if (node == NULL)
    {
        return;
    }
    ReverseLink(node->next);
    printf("%-4c",node->c);
}
View Code

第二种方法 可以将链表反转之后再输出:

Node *ReverseList(Node* node)
{
    Node *Tem,*head = node;
    Node* p = head;
    Node* pre = NULL;
    Tem = NULL;
    while (p!=NULL)
    {
        Tem = p->next;
        if (p->next == NULL)
        {
            head = p;
        }
        p->next = pre;
        pre = p;
        p = Tem;
    }
    return head;
}
View Code

3.链表反转

题目叙述:将链表的头结点变为尾节点,原来的尾节点变成头结点。

该方法就是上题中的第二种算法:

Node *ReverseList(Node* node)
{
    Node *Tem,*head = node;
    Node* p = head;
    Node* pre = NULL;
    Tem = NULL;
    while (p!=NULL)
    {
        Tem = p->next;
        if (p->next == NULL)
        {
            head = p;
        }
        p->next = pre;
        pre = p;
        p = Tem;
    }
    return head;
}
View Code

4.链表的第一个公共结点

题目叙述:两个单向链表,找出它们的第一个公共结点。

//找出链表的第一个公共结点
Node *FirstCommomNode(Node* node1,Node* node2)
{
    Node* p1 = node1;
    Node* p2 = node2;
    int len1,len2,dif;
    if (node1==NULL || node2 == NULL)
    {
        return;
    }
    len1 = LenOfLink(node1);
    len2 = LenOfLink(node2);
    dif = len1 - len2;
    if (len1<len2)
    {
        dif = len2 - len1;
        while (dif)
        {
           dif--;
           p2 = p2->next;
        }
    }
    if (len1>len2)
    {
        while (dif)
        {
           dif--;
           p1 = p1->next;
        }
    }
    while (p1!=p2 || p1==NULL|| p2==NULL)
    {
        p1 = p1->next;
        p2 = p2->next;
    }
    if (p1==NULL)
        return;
    else
        return p1;
}

//获取链表的长度
int LenOfLink(Node* node)
{
    Node* p = node;
    int len = 0;
    while(p!=NULL)
    {
        len++;
        p = p->next;
    }
    return len;
}
View Code

5.在字符串中删除特定的字符

题目叙述:

输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。

例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”。

//在字符串中删除特定的字符
char *string_del_characters( char * const src, const char * const dest )
{
    int i,j,index = 0;
    int destlen = strlen(dest);
    int srclen = strlen(src);
    int hash_table[256] = {0};

    for (i = 0;i < destlen;i++)
    {
        hash_table[*(dest+i)] ++;
    }

    for (j = 0;j < srclen;j++)
    {
        if (hash_table[*(src+j)] == 0)
        {
            src[index++] = *(src+j);
        }
    }
    src[index] = '\0' ;
    return src;
}
View Code


等会实验室要开会了,先写这么多吧!晚上继续写,欢迎各位批评指正!

 

posted on 2014-08-27 16:16  DLMUCAI付  阅读(270)  评论(0编辑  收藏  举报