2014年知名互联网公司笔试题
1. 华为:
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
输入pInputStr: 输入字符串lInputLen: 输入字符串长度
输出 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
注意:只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
* HuaWei: A string compressed example
* */
void stringZip(const char *pInputStr, char *pOutputStr) {
int len = strlen(pInputStr);
char *tmp = (char *)malloc(sizeof(len * sizeof(char)));
int start = 0;
int end = start + 1;
int cnt = 0;
int i = 0;
while(pInputStr[start]) {
if(pInputStr[start] == pInputStr[end]) {
cnt++;
end++;
}
else {
if(cnt == 0) tmp[i++] = pInputStr[start];
else if(cnt > 0) {
tmp[i++] = cnt + 1 + '0';
tmp[i++] = pInputStr[start];
cnt = 0;
}
start = end;
end = start + 1;
}
}
tmp[i] = '\0';
strncpy(pOutputStr, tmp, strlen(tmp));
free(tmp);
}
void main() {
char str[1024];
char compress_str[1024];
printf("Input a string:");
gets(str);
stringZip(str, compress_str);
printf("The compressed string is:");
puts(compress_str);
}
2. 迅雷:
已知集合A和B的元素分别用不含头结点的单链表存储,函数difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成计算后A={10,20,30}。
#include <stdio.h>
#include <stdlib.h>
/*
* XunLei: difference of linked list
* */
typedef struct node {
int elem;
struct node *next;
}node;
void create(node **head, int n) {
int elem;
int i;
node *p;
node *r;
for(i = 0;i < n;i++) {
if(scanf("%d", &elem) != 1) {
perror("input error!\n");
exit(1);
}
p = (node *)malloc(sizeof(node *));
if(!p) {
perror("memory error!\n");
exit(2);
}
p->elem = elem;
p->next = 0;
if(!*head) *head = p;
else {
r->next = p;
}
r = p;
}
}
void show(node *head) {
node *p = head;
while(p) {
printf("%d\n", p->elem);
p = p->next;
}
}
void difference(node **LA, node *LB) {
node *p, *q, *pre;
node *head;
p = *LA;
pre = *LA;
head = p;
while(p) {
q = LB;
while(q) {
if(p->elem == q->elem) break;
q = q->next;
}
if(q) {
if(pre == p) {
p = p->next;
pre->next = 0;
free(pre);
pre = p;
head = p;
}
else {
pre->next = p->next;
p->next = 0;
free(p);
p = pre->next;
}
}
else {
pre = p;
p = p->next;
}
}
*LA = head;
}
void main() {
node *head1 = NULL, *head2 = NULL;
create(&head1, 5);
printf("----------\n");
create(&head2, 3);
difference(&head1, head2);
printf("----------\n");
show(head1);
}
3.美团网:
1、链表翻转。给出一个链表和一个数k,比如链表1→2→3→4→5→6,k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4,翻转后4→3→2→1→5→6,用程序实现:
#include <stdio.h>
#include <stdlib.h>
/*
* XunLei: difference of linked list
* */
typedef struct node {
int elem;
struct node *next;
}node;
void create(node **head, int n) {
int elem;
int i;
node *p;
node *r;
for(i = 0;i < n;i++) {
if(scanf("%d", &elem) != 1) {
perror("input error!\n");
exit(1);
}
p = (node *)malloc(sizeof(node *));
if(!p) {
perror("memory error!\n");
exit(2);
}
p->elem = elem;
p->next = 0;
if(!*head) *head = p;
else {
r->next = p;
}
r = p;
}
}
void show(node *head) {
node *p = head;
while(p) {
printf("%d\n", p->elem);
p = p->next;
}
}
/*
* reverse the sub link list the length of which is k
* */
void reverse_node(node **LA, int k) {
node *head; // the temporary head node
node *start; // the start node of every sub link list
node *end; // the end node of every sub link list
node *p; // the current node of orignal link list
node *r; // the removed node
head = (node *)malloc(sizeof(node *));
if(!head) {
perror("memory error!\n");
exit(1);
}
head->next = NULL;
start = head;
int cnt = 0;
p = *LA;
while(p) {
if(cnt < k) {
r = p;
p = p->next;
r->next = start->next;
start->next = r;
if(cnt == 0) end = r;
cnt++;
}
else if(cnt == k) {
cnt = 0;
start = end;
}
else break;
}
*LA = head->next;
head->next = NULL;
free(head);
}
void main() {
node *head = NULL;
create(&head, 6);
printf("----------\n");
int k;
printf("k = ");
if(scanf("%d", &k) == 1 && k > 0) reverse_node(&head, k);
show(head);
}