面试题总结(一)
马上又是一年一度的求职的浪潮又要袭来,作为一名即将毕业的在校生倍感压力,最近这段时间也准备了一下面试,随着复习的积累,但发现自己健忘的能力越来越强,思来想去最后还是以博客的形式将其存储起来,这样既方便于大家有空可以瞄一下,也有益于鄙人将来复习之用。当然所呈现的题目都是一些经典的面试题,对于给出的答案也都是网上曝出的经典解决方法,有些面试题不止一种解决方法,所有程序都会在自己的电脑上运行成功之后粘贴出来,当然如果是借鉴别人的算法,也会将其出处一并粘贴出来。前期集中一些有关字符串和链表的问题。
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; }
2.逆序输出链表
题目叙述:输入一个链表的头结点,从尾到头反过来输出每个结点的值。
递归方式:
void ReverseLink(Node* node) { if (node == NULL) { return; } ReverseLink(node->next); printf("%-4c",node->c); }
第二种方法 可以将链表反转之后再输出:
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; }
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; }
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; }
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; }
等会实验室要开会了,先写这么多吧!晚上继续写,欢迎各位批评指正!