面试题
2013-10-30 11:01
190 查看
本文为本人原创,欢迎转载!
转载请注明出处:snowboy.blog.chinaunix.net
雪夜流星
------------------------------------------
n年没笔试了,9月16号迎来了笔试第一站,试卷分为两部分,第一部分是选择题,第二部分是综合题。选择题依稀记得有个arp的功能(把ip地址转换为mac地址),下面贴一下综合题。
1.找出一个序列中的最长递减子序列,如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2};代码实现如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_LEN 255
/*****************************************************************************************
*功能描述:找出一个序列中的最长递减子序列,如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
*传入参数:str:源数组首地址, len:数组的长度
*传出参数:str:递减子序列的数组首地址,传入参数和传出参数空间复用,降低空间复杂度
*返回值: 递减子序列的数组首地址
****************************************************************************************/
char *substring(char *str, int len)
{
char b[MAX_LEN] = {0};//定义数组长度必须为常量,不能为变量或者只读变量
int i, j, k=0, tmp;
if ((str == NULL)||(len <1))
{
return NULL;
}
for (i=0; i<len; i++)
{
tmp = str[i];
for (j=i+1; j<len; j++)//遍历当前元素后面的所有元素,如果有比当前元素大的则退出循环
{
if (str[i] <= str[j])
{
break;
}
}
if (j == len)//循环正常结束,即后面没有比当前数要大的,将其则放入新数组中
{
b[k] = tmp;
k++;
}
}
b[k] = '\0';//最后将新数组赋结束符
strcpy(str, b);//将新数组元素拷贝到源数组中,复用空间
return str;
}
int main(void)
{
char a[10] = "954325432";
char *b;
b = substring(a, 10);
printf("b:%s\n", b);
return 0;
}
2.将两个有序链表合并成为一个有序链表(附带测试程序)
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}link;
/*****************************************************************
*功能描述:合并两个带头结点的有序链表使其仍然有序
*传入参数:head1,head2:两个有序链表
*传出参数:无
*返回值: 合并后的有序链表的头指针
****************************************************************/
link *mergelist(link *head1, link *head2)
{
link *pa = NULL;
link *pb = NULL;
link *pc = NULL;
link *head3 = NULL;
pa = head1->next;
pb = head2->next;
head3 = pc = head1;
while ((pa != NULL) && (pb != NULL))
{
if (pa->data <= pb->data)
{
pc->next = pa; pc = pa; pa = pa->next;
}
else
{
pc->next = pb; pc = pb; pb = pb->next;
}
}
pc->next = pa ? pa : pb;//插入剩余段
free(head2);
return head3;
}
/*创建带头结点的链表*/
link *creat(void)
{
link *head = NULL;
link *tail = NULL;
link *cur = NULL;
int x;
head = (link *)malloc(sizeof(link));
if(!head)
{
printf("malloc error\n");
exit(1);
}
tail = head;
while(1)
{
printf("please input data:");
scanf("%d", &x);
if(x <= 0)
{
break;
}
cur = (link *)malloc(sizeof(link));
if(!cur)
{
printf("malloc error\n");
exit(1);
}
cur->data = x;
cur->next = NULL;
tail->next = cur;
tail = cur;
}
printf("creat list success\n");
return head;
}
/*打印带头结点的链表*/
void printl(link * head)
{
link *p = NULL;
if(!head)
{
return;
}
for(p=head->next; p; p=p->next)
{
printf("%d ", p->data);
}
printf("\n");
return;
}
int main(void)
{
link *head1, *head2, *head3;
head1 = creat();
head2 = creat();
printl(head1);
printl(head2);
head3 = mergelist(head1, head2);
printl(head3);
return 0;
}
小结:这个公司招的人少,笔试的人却很多,僧多粥少,准备迎接下一站,希望后面的路会更顺利。
转载请注明出处:snowboy.blog.chinaunix.net
雪夜流星
------------------------------------------
n年没笔试了,9月16号迎来了笔试第一站,试卷分为两部分,第一部分是选择题,第二部分是综合题。选择题依稀记得有个arp的功能(把ip地址转换为mac地址),下面贴一下综合题。
1.找出一个序列中的最长递减子序列,如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2};代码实现如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_LEN 255
/*****************************************************************************************
*功能描述:找出一个序列中的最长递减子序列,如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}
*传入参数:str:源数组首地址, len:数组的长度
*传出参数:str:递减子序列的数组首地址,传入参数和传出参数空间复用,降低空间复杂度
*返回值: 递减子序列的数组首地址
****************************************************************************************/
char *substring(char *str, int len)
{
char b[MAX_LEN] = {0};//定义数组长度必须为常量,不能为变量或者只读变量
int i, j, k=0, tmp;
if ((str == NULL)||(len <1))
{
return NULL;
}
for (i=0; i<len; i++)
{
tmp = str[i];
for (j=i+1; j<len; j++)//遍历当前元素后面的所有元素,如果有比当前元素大的则退出循环
{
if (str[i] <= str[j])
{
break;
}
}
if (j == len)//循环正常结束,即后面没有比当前数要大的,将其则放入新数组中
{
b[k] = tmp;
k++;
}
}
b[k] = '\0';//最后将新数组赋结束符
strcpy(str, b);//将新数组元素拷贝到源数组中,复用空间
return str;
}
int main(void)
{
char a[10] = "954325432";
char *b;
b = substring(a, 10);
printf("b:%s\n", b);
return 0;
}
2.将两个有序链表合并成为一个有序链表(附带测试程序)
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}link;
/*****************************************************************
*功能描述:合并两个带头结点的有序链表使其仍然有序
*传入参数:head1,head2:两个有序链表
*传出参数:无
*返回值: 合并后的有序链表的头指针
****************************************************************/
link *mergelist(link *head1, link *head2)
{
link *pa = NULL;
link *pb = NULL;
link *pc = NULL;
link *head3 = NULL;
pa = head1->next;
pb = head2->next;
head3 = pc = head1;
while ((pa != NULL) && (pb != NULL))
{
if (pa->data <= pb->data)
{
pc->next = pa; pc = pa; pa = pa->next;
}
else
{
pc->next = pb; pc = pb; pb = pb->next;
}
}
pc->next = pa ? pa : pb;//插入剩余段
free(head2);
return head3;
}
/*创建带头结点的链表*/
link *creat(void)
{
link *head = NULL;
link *tail = NULL;
link *cur = NULL;
int x;
head = (link *)malloc(sizeof(link));
if(!head)
{
printf("malloc error\n");
exit(1);
}
tail = head;
while(1)
{
printf("please input data:");
scanf("%d", &x);
if(x <= 0)
{
break;
}
cur = (link *)malloc(sizeof(link));
if(!cur)
{
printf("malloc error\n");
exit(1);
}
cur->data = x;
cur->next = NULL;
tail->next = cur;
tail = cur;
}
printf("creat list success\n");
return head;
}
/*打印带头结点的链表*/
void printl(link * head)
{
link *p = NULL;
if(!head)
{
return;
}
for(p=head->next; p; p=p->next)
{
printf("%d ", p->data);
}
printf("\n");
return;
}
int main(void)
{
link *head1, *head2, *head3;
head1 = creat();
head2 = creat();
printl(head1);
printl(head2);
head3 = mergelist(head1, head2);
printl(head3);
return 0;
}
小结:这个公司招的人少,笔试的人却很多,僧多粥少,准备迎接下一站,希望后面的路会更顺利。
相关文章推荐
- 三道PHP面试题
- sony面试题(输出* .这样的字符)
- 面试题:赛马问题
- 【黑马程序员】 学习笔记 - 直击7K面试题 - 张孝祥老师的交通等管理系统
- jsp面试题
- 【剑指Offer学习】【面试题25:二叉树中和为某一值的路径】
- 面试题整理【1】JAVA基础知识
- 寻找大小为n的数组中出现次数超过n/2的那个数 (美团面试题)
- 【面试题】剑指Offer-28-字符串的全排列
- java面试题
- 面试题:long a=0x801010;a+5?
- 软件测试面试题
- 面试题1
- 性能测试面试题汇总
- 程序员面试题精选100题(01)-把二元查找树转变成排序的双向链表[数据结构
- Single Number 谷歌面试题
- c++面试题
- 前端常见面试题
- C/C++面试题(3)——剑指offer1(赋值运算符函数)
- Java面试题二