您的位置:首页 > 理论基础 > 数据结构算法

C语言数据结构笔试题

2014-11-23 22:53 120 查看
1. 实现一个lite版的字符串替换函数

C/C++:

char *strreplace(char *str, const char *sub, const char *rep)

Java:

char[] strreplace(char[] str, char[] sub, char[] rep)

限制条件和要求如下:

1. 其中str为原字符串,sub为待被替换的子串。为简单起见, 假定字符串sub和rep长度一样

2. 直接对原字符串str进行修改并返回, 不得使用malloc/new开辟新的内存空间

3. 不得使用任何库函数/API, 包括但不限于strlen, strstr, strcpy, 如需使用类似功能, 请自行实现

int mystrlen(const char *s)
{
//计算字符串长度
const char* p = s;
while(*p != '\0')
p++;
return p - s;
}

int findstr(const char *str,const char *sub)
{
int str_len = mystrlen(str);
int sub_len = mystrlen(sub);
int i = 0;
int j = 0;
while(i <str_len && j < sub_len )
{
//相等就对i,j进行++操作
if(str[i] == sub [j])
{
++i;
++j;
}
else
{
//退回到第一次匹配的下一坐标
i = i - j + 2;
j = 0;
}
}
//j大于或者等于sub_len的时候表示sub与str比较完成
if(j >= sub_len)
return i - sub_len;
else
return -1;

}

char *strteplace(char *str,const char *sub,char *rep)
{
int a;
<span style="white-space:pre">	</span>//查找该字符串是否在

if(a = findstr(str,sub) == -1)
{
printf("字符串不存在");
return NULL;
}

int rep_len = mystrlen(rep);
char *p = str;
char *s = str;
for (int i = a,j = 0;j < rep_len; i++,j++)
{
str[i] = rep[j];
}

return str;

}


2. 假设有两个单链表A和B,不带头节点,且长度一样,示例如下:

A: 1->2->3->4

B: a->b->c->d

请逆转交替合并两个链表,示例结果如下:

4->d->3->c->2->b->1->a

C/C++:

节点类型定义如下:

struct Node {

struct Node *next;

...

}

函数定义如下:

Node *reverse_merge(Node *A, Node *B)

其中A、B分别是指向对应链表的第一个节点的指针

请直接修改原有链表的next指针完成该操作,并返回新链表的第一个节点的指针

Java:

节点类型定义如下:

class Node {

public Node next;

...

}

函数定义如下:

Node reverse_merge(Node A, Node B)

其中A、B分别是对应链表的第一个节点的引用

请直接修改原有链表的next引用完成该操作,并返回新链表的第一个节点的引用

typedef struct Node {
char data;
struct Node *next;
}Node;
typedef Node *ListNode;

Node *reverse_merge(Node *A, Node *B)
{
ListNode p,s,t = NULL;

p =  ReverseList(A);
s =  ReverseList(B);
if(p == NULL || s == NULL)
return NULL;
ListNode temp = p;
while(s != NULL)
{
//循环遍历两个链表将s中的节点依次插入p链表中
t = s->next;
s->next= p->next;
p->next = s;
p = s->next;
s = t;
}

return temp;
}

//对链表进行反转
ListNode ReverseList(ListNode list)
{
Node   *tmp = NULL;
Node   *p = NULL;

if (list == NULL)
{
return NULL;
}
tmp = list->next;
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre">	</span>//不断的将tmp节点的后继节点移动到头节点</span>
while (tmp->next != NULL)
{
p = tmp->next; <span style="white-space:pre">		</span>
tmp->next = p->next; <span style="white-space:pre">	</span>
p->next = list->next;
list->next = p;
}

return list;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: