字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
方法1:定义临时变量,两个循环,此方法效率比较低。
代码如下:
#include<string.h>
char* reverseLeftWords(char* s, int n)
{
int len=strlen(s);
n=n%len;
int i=0;
int j=0;
for(i=0;i<n;i++) //旋转n个,
{
char tmp=*s; //定义一个临时变量
for(j=0;j<len-1;j++)//旋转一个
{
*(s+j)=*(s+j+1);
}
*(s+len-1)=tmp;
}
return s;
}
int main()
{
int k = 0;
char arr[] = "bit education";
int len = strlen(arr);
scanf("%d", &k);
left_move1(arr, k,len);
printf("%s\n", arr);
return 0;
}
方法2:把字符串分为两个部分,一部分k前面的字符,一部分k后面的字符,先旋转前面字符,再旋转后面字符,再整体旋转。
代码如下:
void reverse(char* left, char* right) //方法2
{
assert(left&&right);
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
char* left_move2(char* arr, int k)
{
assert(arr);
int len = strlen(arr);
reverse(arr, arr + k - 1);
reverse(arr + k, arr + len - 1);
reverse(arr, arr + len - 1);
return arr;
}
int main()
{
int k = 0;
char arr[] = "bit education";
int len = strlen(arr);
scanf("%d", &k);
left_move2(arr, k);
printf("%s\n", arr);
return 0;
}
请判断一个链表是否为回文链表。
思路二的效率更高,所以实现思路二:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdbool.h>
struct ListNode
{
int val;
struct ListNode* next;
};
struct ListNode* middleNode(struct ListNode* head)
{
struct ListNode* fast = head, *slow = head;
while (fast&&fast->next)
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
struct ListNode* reverse(struct ListNode* head)
{
struct ListNode* cur = head;
struct ListNode* newhead = NULL;
while (cur)
{
struct ListNode* next = cur->next;
cur->next = newhead;
newhead = cur;
cur = next;
}
return newhead;
}
bool isPalindrome(struct ListNode* head)
{
struct ListNode* mid = middleNode(head);
struct ListNode* rhead = reverse(mid);
while (head&&rhead)
{
if (head->val != rhead->val)
{
return false;
}
else
{
head = head->next;
rhead = rhead->next;
}
}
return true;
}
输入两个链表,找出它们的第一个公共节点。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
struct ListNode
{
int val;
struct ListNode* next;
};
//1.求出两个链表的长度
//2.比较两个链表谁更长
//3.求出两个链表的相差的长度
//4.长的链表先走相差的长度,然后两链表一起走完
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB)
{
if (headA == NULL || headB == NULL)
{
return NULL;
}
struct ListNode* curA = headA, *curB = headB;
int lenA = 0;
int lenB = 0;
while (curA->next) //如果curA是空链表,则程序崩溃
{
lenA++;
curA = curA->next;
}
while (curB->next)
{
lenB++;
curB = curB->next;
}
if (curA != curB)
{
return NULL;
}
struct ListNode* longList = headA, *shortList = headB;
if (lenB > lenA)
{
longList = headB;
shortList = headA;
}
int gap = abs(lenA - lenB);
while (gap--)
{
longList = longList->next;
}
while (longList != shortList)
{
longList = longList->next;
shortList = shortList->next;
}
return longList;
}
int main()
{
return 0;
}
以上就是今天要讲的内容,本文仅仅简单介绍了链表的使用和左旋字符串,这些题目可能以后面试时会用到,我们务必掌握。另外,如果上述有任何问题,请懂哥指教,不过没关系,主要是自己能坚持,更希望有一起学习的同学可以帮我指正,但是如果可以请温柔一点跟我讲,爱与和平是永远的主题,爱各位了。
▌ 问题描述 近期,线上有个重要Mysql客户的表在从5.6升级到5.7后,master上插入...
攻防世界 REVERSE 新手区/game 下载得到附件 用IDA32位打开 先找下main函数 找到...
前言 接着之前一篇文章《记一次由于网站被黑导致重新搭建服务器生产环境》 https...
一、什么是Ajax Ajax:异步的JavaScript和Json(这里XML改为了Json); 作用:用于...
链接当前页面。 ------------------- 通常有如下用法 : a h...
如果您是Linux的新手,那么一些常见错误很可能会给您带来麻烦。提前了解它们,您...
云计算发展有几十年的历史了随着科技的进步和发展云技术慢慢渗透到各行各业企业...
概述 一般生产环境都需要定期去做一次mysql数据库主备切换演练,这里简单记录一...
本文实例讲述了Yii 框架使用Gii生成代码操作。分享给大家供大家参考,具体如下:...
在今天更新的官方博文中,微软解释了如何让终端用户和网络管理员更快安装 Window...