2015届[2014年夏]华为公司校招机试中级题试水
本文由CSDN-蚍蜉撼青松【主页:http://blog.csdn.net/howeverpf】原创,转载请注明出处!
写在前面:
当前华为公司的一次机试。共三道不同难度的编程题(当中,0基础题60分、中级题100分、高级题160分),机试成绩>=60就可以參加下一轮面试。
一定程度上说。仅仅要全然做对0基础题,就行通过机试的考验。可是,可以部分或全然完毕后面的中高级题,一定会为你后面的面试增色不少。
写作本文的目的有两个。一是对本次參加的华为公司机试做个整理和小结。属于自我提升;二是让各位求职的应届生同道可以直观体验当前一般的机试题大概是何种类型,难度又有几分,属于经验分享。因为仅仅是作为体验而非试题汇总,所以本文仅仅列举了我以及我的小伙伴们遇到的几次机试中的中级题。并不做很多其它的收集。
每道题包含题目详情、编程思路、代码实现三部分。
1、逆序链表输出(測试模拟题)
| 描写叙述: |
输入一个单向链表,将链表逆序后输出各结点的值。 |
| 执行时间限制: | 60 Sec |
| 内存限制 | 256 MByte |
| 输入: |
顺序输入链表的各结点,用逗号(",")作为结点数据的分隔符; 比如:链表1->2->3->4->5,输入为:"1,2,3,4,5"
|
| 输出: |
逆序后链表的各结点,用逗号(",")作为结点数据的分隔符; 比如上述链表逆序后为5->4->3->2->1。输出为:"5,4,3,2,1"
|
| 例子输入: | 1,2,3,4,5 |
| 例子输出: | 5,4,3,2,1 |
编程思路:
遍历原链表,对每一个结点:记录前一个被遍历的结点(即其前驱结点,需额外开辟空间)、当前结点、当前结点的后继;令当前结点的前驱结点变为其后继结点。当前结点的后继结点变为新的当前结点。对链表的第一个和最后一个结点特殊处理。
代码实现:
#include <stdio.h>
#include <stdlib.h>
// 链表结点结构
typedef struct tagListNode
{
int value;
struct tagListNode *next; //后继结点指针
}ListNode;
// 创建一个新的链表结点
//參数 ppstNode,指向新结点指针的指针
//參数 nValue, 新结点的值(整数形式)
void new_node_create(ListNode **ppstNode, int nValue)
{
*ppstNode = (ListNode*)malloc(sizeof(ListNode));
(*ppstNode)->value = nValue;
(*ppstNode)->next = NULL;
}
// 创建一个新的链表结点并将其附加到指定链表的尾部
//參数 ppstTail,指向链表最后一个结点指针的指针
//參数 pValue, 新结点的值(字符串形式)
void new_node_append(ListNode **ppstTail, char *pValue)
{
ListNode *pstNow;
new_node_create(&pstNow, atoi(pValue));
(*ppstTail)->next = pstNow;
*ppstTail = pstNow;
}
// 依据标准输入的内容创建链表
//參数 ppstTail,指向链表头结点的指针的指针
void list_create(ListNode **ppstHead)
{
ListNode *pstTail;
char szInput[100];
char *p;
int i;
// 读入标准输入
scanf("%s", szInput);
// 依据标准输入的内容创建链表
pstTail = *ppstHead;
p = szInput;
for(i=0; szInput[i]!='