字符串旋转问题详解

article/2025/10/8 4:23:45

题目名称:
字符串左旋
题目内容:
实现一个函数,可以左旋字符串中的k个字符。

例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

方法一:暴力求解
这种方法相对比较容易,我们先来看看代码:

void left_move(char* arr, int k)
{int i = 0;assert(arr);int len = strlen(arr);for (i = 0; i < k; i++){//左旋转1个字符//1. 保存第一个字符char tmp = *arr;//2. 把后续的字符一次往前移动int j = 0;for (j = 0; j < len - 1; j++){*(arr + j) = *(arr + j + 1);}//3. 把保存好的第一个字符存放在最后*(arr + len - 1) = tmp;}
int main()
{char arr[] = "abcdef";//左旋转字符串left_move(arr, 1);printf("%s\n", arr);//打印字符串return 0;
}

首先我们建立数组来存储abcdef,此处不能用char* p的指针存储“abcdef”中a的地址,因为用指针存储,存放的是常量字符串,而常量字符串是不可被修改的。不可被修改就没有旋转字符串做法一说。

这时自定义函数left_move来实现字符串的左旋,将数组的数组名与需要左旋转的次数做为实参传入该函数中。

left_move函数内部分析:假设我们只让字符串左旋一次,要用for循环来实现。而左旋的思路为:首先将字符串的首字母存入临时变量中,再将首字母后的所有字母提前1位(除了’\0’以外),再将临时变量中首字母的内容存放到字符串的最右边。以下示意图可以更容易理解。

方法二:分开逆转字符串

思路:假设我们需要左旋转前两个字母,因此我们先让前两个字母进行逆转;再将除了前两个字母以外的所有字母也逆转;最后再将所有字母进行逆转,结果我们会发现这样的方法直接将前两个字母达成了左旋转效果。下面的图能够帮助理解。

先将前两个字母逆转:

将除了前两个字母进行逆转:

将所有字母逆转:

代码如下:

void reverse1(char* l, char* r)
{assert(l && r);//避免l与r指针是空指针while (l < r)//进行字母逆转{char tmp = *l;*l = *r;*r = tmp;r--;l++;}
}void reverse(char* arr1, int len, int k)
{assert(arr1);k %= len;//避免需要左旋的字母过多reverse1(arr1, arr1 + k - 1);//先将需要左旋的字母逆转reverse1(arr1 + k, arr1 + len - 1);//除了需要左旋的字母以外的字母逆转reverse1(arr1, arr1 + len - 1);//所有字母逆转
}int main()
{char arr1[] = "ABCDE";int len = strlen(arr1);int k = 2;//假设左旋转前两个字母reverse(arr1, len, k);printf("%s\n", arr1);return 0;
}

题目名称:
字符串旋转结果
题目内容:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

方法一:

思路:在上面题型中,我们得知了字符串左旋的两种方法。这题我们关键就在于如何判断一个字符串是否是另一个字符串左旋得来的。比较两个字符串是否相等,这里我们联想到了strcmp函数,如果两个字符串相等,strcmp函数会返回0。当然,如果两个字符串的长度都不相等,那么两个字符串如何左旋转也不可能相等。

代码如下:

#include <stdio.h>
#include <string.h>
#include <assert.h>
void reverse(char* left, char* right)
{while (left < right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}
}
void left_move(char* arr1,int k)
{int len = strlen(arr1);reverse(arr1, arr1 + k-1);reverse(arr1 + k, arr1 + len - 1);reverse(arr1, arr1 + len - 1);
}
int is_left_move(char* arr1,char* arr2)
{int len1 = strlen(arr1);int i = 0;for (i = 0; i < len1 - 1; i++){left_move(arr1,1);if (strcmp(arr1, arr2) == 0){return 1;}}return 0;
}
int main()
{char arr1[20] = "AABCD";//AABCDAABCDchar arr2[] = "BCD";int ret = is_left_move(arr1, arr2);if (ret == 1)printf("YES\n");elseprintf("NO\n");return 0;
}

方法二:

思路:利用库函数strncat(在所需要追加的字符串后面追加字符),在形参中我们可见第一个传入的实参是所需要追加字符的地址,第二个传入的是追加的字符串的来源,第三个传入的是追加字符的个数。而strstr函数是观察一个字符串从首地址开始往后数是否能遇到另一个字符串。例如字符串1 abcdefg与字符串2 def,从字符串1的首元素a的地址往后数,在d地址处开始到f地址,正好与字符串2的def字符串相等,则strstr会返回d的地址,如果需要打印,则能打印出字符串defg。以下是strncat函数与strstr函数的形式参数及作用。

在这里插入图片描述

在这里插入图片描述

代码如下:

int is_left_move(char arr1[], char arr2[])
{assert(arr1);assert(arr2);int len1 = strlen(arr1);int len2 = strlen(arr2);if (len1 != len2)return 0;//1. 给arr1的后边追加一个arr1中的字符串strncat(arr1, arr1, len1);//2. 判断arr2是否是arr1的字串if (NULL == strstr(arr1, arr2))//如果arr1的内容没有arr2的内容,则返回NULL{return 0;}else{return 1;}
int main()
{char arr1[20] = "AABCD";//AABCDAABCDchar arr2[] = "BCD";int ret = is_left_move(arr1, arr2);if (ret == 1)printf("YES\n");elseprintf("NO\n");return 0;
}

如果这篇文章对您理解字符串旋转问题有帮助,麻烦点个赞谢谢!


http://chatgpt.dhexx.cn/article/gUbJZ3oo.shtml

相关文章

Python——旋转字符串

题目描述 给定两个字符串s和goal&#xff0c;如果在若干次旋转操作后s能够变成goal&#xff0c;那么就返回True s的旋转操作就是把s最左面的字符放到最右面 例如&#xff1a; s ‘abcde’ 旋转一次就是‘bceda’ 而如果goal是bceda&#xff0c;那么goal就是s的旋转字符串 P…

【旋转字符串的四种方法】

目录&#xff1a; 前言一、题目描述二、题目解析&#xff08;一&#xff09;依次左旋&#xff08;二&#xff09;创建中间数组&#xff08;三&#xff09;三次倒置&#xff08;四&#xff09;接长数组 总结 前言 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 旋转字符…

Android 实时监听APP进入前台或后台

下面已更新说明 前言 在我们开发的过程中&#xff0c;经常会遇到需要我们判断app进入后台&#xff0c;或者切换到前台的情况。比如我们想判断app切换到前台时&#xff0c;显示一个解锁界面&#xff0c;要求用户输入解锁密码才能继续进行操作&#xff1b;我们想判断app切换到后…

什么是后台

什么是后台&#xff1f; 后台指的是运行在后台并且控制着前端的内容&#xff0c;它主要负责程序设计架构思想&#xff0c;管理数据库等。后台更多的是应用到数据库并且进行交互以处理相应的业务逻辑。它需要考虑的是如何实现功能、数据的存取、平台的稳定性与性能等方面。需要参…

Android后台应用开启前台服务---android8到android12梳理

以下内容都是针对start方式启动的service&#xff0c;而非bind启动的srevice。因为bind启动的服务生命周期始于Activity绑定在一起的&#xff0c;会随Activity的销毁而停止。但start方式启动的service独立的&#xff0c;即使应用销毁它也可以继续运行&#xff0c;故Android系统…

关闭后台App刷新后台应用刷新是做什么的

官方解释 “后台应用刷新” 是什么作用&#xff08;如图&#xff09; 关闭后台应用刷新&#xff0c;并不会影响到消息接收&#xff08;因为消息接收是通过Apple Push Notification机制来的&#xff09;省电模式默认全部应用都关闭刷新&#xff08;说明关闭可以省电&#xff09…

Android——后台服务

Android应用编程实验 实验名称&#xff1a;Android 后台服务 实验目的&#xff1a;通过Service设计后台服务程序&#xff0c;通过Broadcast实现信息广播机制 实验内容&#xff1a; 设计一个简单的后台音乐服务程序&#xff1b;设计一个简单的信息广播程序示例&#xff1b;利用B…

Android应用后台网络管控机制

应用后台网络管控机制 概述 在维护手管应用时&#xff0c;经常遇到与应用后台网络控制相关的问题&#xff0c;在解决这些问题的过程中&#xff0c;学习了下应用后台网络控制的流程以及一些日志的分析方法&#xff0c;现在把它总结一下&#xff0c;方便自己以及他人的学习。 网…

Android将后台应用唤起到前台的方法

在我们开发的过程中&#xff0c;经常遇到app进入后台&#xff0c;或者切换到前台的情况。 比如&#xff1a; 从后台切换到前台显示全屏广告实践来电显示从后台切换到前台 如图显示&#xff1a;压后台10秒钟&#xff0c;自动弹出 实现主要分为两个步骤&#xff1a; 第一步通…

后台功能

#&#x1f30c; 后台功能 后台功能模块&#xff0c;包含主控面板&#xff0c;开发管理&#xff0c;日志管理&#xff0c;系统监控&#xff0c;通知公告&#xff0c;文件管理&#xff0c;定时任务。 #1. 主控面饭 主控面板展示了系统的一些统计信息&#xff0c;采用默认的ant…

如何让应用保持后台运行,做到保活?

其实&#xff0c;我们无法做到真正意义上的保活&#xff0c;应为系统进程会自动杀死占用过大内存的某个应用。 但我们还有一种选择&#xff0c;就是过滤该应用的包名&#xff0c;做到后台任务键清理不掉它&#xff0c;单独去除不掉它&#xff0c;只有返回键才能做到真正的退出…

【已解决】Android 如何让应用在后台运行

应用在后台跑&#xff0c;这种说法可能不够准确&#xff0c;就是说应用没有finish退出&#xff0c;但也不在前台的状态&#xff0c;例如应用执行中点击了home键一样。如何实现呢&#xff1f; 要点&#xff1a; 退回后台是执行了home键&#xff0c;activity分别执行了onPause和…

如何让安卓APP一直在后台运行?

本文摘自微信公众号“android高心星的私塾” 一 声明 1 网上很多的保活手段&#xff0c;但是不靠谱的居多 2 本文只是进行保活知识的推广&#xff0c;不是在教你做永生不死的进程 二 保活手段 1 业界保活手段&#xff1a;黑色保活&#xff0c;灰色保活&#xff0c;白色保活 2…

Android | 判断App处于前台还是后台的方案

很多场景下&#xff0c;都需要判断某个App处于前台还是后台。本文集网上编写的前台判断方案于一体。 目前&#xff0c;有6种方案&#xff1a; 方 法 判断原理需要权限可以判断其他应用位于前台特点①RunningTask否Andorid4.0系列可以&#xff0c;5.0以上机器不行Android5.0此方…

fastapi_No.18_后台应用

文章目录 简介使用场景 创建后台应用步骤第一步&#xff1a;定义后台应用函数第二步&#xff1a;使用后台应用函数 在依赖项中的后台应用示例代码示例代码说明 简介 后台应用就是在发送响应后运行的函数。通常用在请求后需要耗费较长时间处理&#xff0c;且客户端不需要在接收…

win11如何禁用后台应用权限 Windows11禁用后台应用权限的设置方法

我在使用Win11系统的电脑时经常会遇到自动打开应用程序情况&#xff0c;很多小伙伴都不知道到如何关闭&#xff0c;那么遇到这种情况应该要如何解决呢?下面就和小编一起来看看Win11系统要如何去禁用软件的后台权限吧。更多windows11系统教程&#xff0c;可以参考小白一键重装网…

提高软件CPU占用率

案例&#xff1a; 独立线程以5ms一包的速率接收指令&#xff08;一共大概70-80种指令类型&#xff09;&#xff0c;并放入一个队列A 主线程中&#xff0c;根据定时器去队列A中取数据&#xff0c;并解析/计算/显示&#xff08;速率&#xff1a;200包/秒&#xff09; 现象&…

CPU使用率100%,如何解决

文章目录 CPU使用率概念CPU使用率的重要指标计算公式 查看CPU使用率CPU 使用率过高总结 CPU使用率 概念 单位时间内CPU使用情况的统计&#xff0c;以百分比方式显示 Linux是一个多任务操作系统&#xff0c;将每个CPU的时间划分为很短的时间片&#xff0c;通过调度器轮流分配…

解决 服务器cpu使用率100%,变成矿鸡之我与病毒crypto斗智斗勇,宝塔面板cpu使用率100%爆红

关于 简单解决宝塔面板显示CPU使用率 100%&#xff0c;但top却没找到相关进程这件事&#xff01;&#xff01;&#xff01; 如图&#xff1a; 作为一个小白&#xff0c;我只是想简单的搭建一个个人网站&#xff0c;结果碰到这个闹心的事。 服务器: 阿里云服务器 面板&#xff…

linux的mysql占用cpu过高_关于在Linux环境下,Mysql占用CPU使用率100%的优化

今天使用 MobaXterml 连接上一台物联网的Linux服务器的使用&#xff0c;发现该服务器的CPU使用率一直在100%左右。 使用top 命令发现Mysql占用了大量的CPU 用数据库工具 Navicat premium 以 root 的身份连接数据库&#xff0c;执行查询语句&#xff1a; show PROCESSLIST; 发现…