C语言数据结构笔试题

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; 
} 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值