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