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

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

目录:

  • 前言
  • 一、题目描述
  • 二、题目解析
    • (一)依次左旋
    • (二)创建中间数组
    • (三)三次倒置
    • (四)接长数组
  • 总结

前言

在这里插入图片描述

来源:力扣(LeetCode)
旋转字符串


一、题目描述

题目描述:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。
比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1:
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
示例 2:
输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”


二、题目解析

题目要求将字符串左旋,也就是将前面n个字符移动到字符串的后面。
我们大家可以先来思考一下如果题目没有任何要求的情况下我们可以怎么做、
如果题目限定空间复杂度为O(1)我们可以怎么做、
如果题目限定时间复杂度为O(n)我们又可以怎么做?


这里我们可以想到的最简单的做法就是一个字符一个字符进行移动,需要左旋几个我们就移动几次就好;
如果我们可以创建一个新的数组,将需要左旋的字符后面的字符放到新的字符串的前面,之后再把需要左旋的字符复制到后面就好;
以上两种方法第一种需要多次循环遍历,第二种需要额外开辟一个数组,
如果题目要求时间复杂度O(n),空间复杂度O(1)的话我们就需要另寻他法了。
下面就让我们带着对更优解法的好奇心先来实现前两种方法吧。

(一)依次左旋

代码如下:

#include<stdio.h>
#include<assert.h>
#include<string.h>char* move(char* str, int n)
{assert(str);int len = strlen(str);int num = n % len;//如果len = 5, n = 10,那么就是把字符串整体左旋两遍 == 原字符串//所以取模之后我们可以避免重复左旋int i = 0;for (i = 0; i < n; i++){//如果大家了解过memmove内存移动函数就可以直接进行复制char ch = str[0];memmove(str, str + 1, len - 1);str[len - 1] = ch;/*memmove函数的替代方案char ch = str[0];int j = 0;for (j = 0; j < len - 1; j++){str[j] = str[j + 1];}str[j] = ch;*/}return str;
}int main()
{char str[52] = { 0 };printf("请输入字符串:");scanf("%s", str);printf("请输入左旋字符的个数:");int n = 0;scanf("%d", &n);printf("左旋后的字符串:%s\n", move(str, n));return 0;
}

运行实例:
在这里插入图片描述


(二)创建中间数组

代码如下:

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>char* move(char* str, int n)
{assert(str);int len = strlen(str);int num =n % len;char* arr = (char*)malloc(len);//中间字符串memcpy(arr, str + n, len - n);memcpy(arr + len - n, str, n);memcpy(str, arr, len);/*上面三个函数可以用下面的代码替代int sz = 0;int i = 0;for (i = num; i < len; i++){arr[sz++] = str[i];}for (i = 0; i < num; i++){arr[sz++] = str[i];}for (i = 0; i < len; i++){str[i] = arr[i];}*/return str;
}int main()
{char str[52] = { 0 };printf("请输入字符串:");scanf("%s", str);printf("请输入左旋字符的个数:");int n = 0;scanf("%d", &n);printf("左旋后的字符串:%s\n", move(str, n));return 0;
}

运行实例:
在这里插入图片描述


(三)三次倒置

下面我们来介绍一种大佬设计的非常在这里插入图片描述的算法:先将需要左旋的字符串倒置,再将剩下的字符倒置,最后再将整体倒置。

图解:
在这里插入图片描述
代码如下:

void rotate(char* left, char* right)
{assert(left && right);while (left < right){char ch = *left;*left = *right;*right = ch;left++;right--;}
}char* move(char* str, int n)
{assert(str);int len = strlen(str);rotate(str, str + n - 1);rotate(str + n, str + len - 1);rotate(str, str + len - 1);return str;
}int main()
{char str[52] = { 0 };printf("请输入字符串:");scanf("%s", str);printf("请输入左旋字符的个数:");int n = 0;scanf("%d", &n);printf("左旋后的字符串:%s\n", move(str, n));return 0;
}

运行实例:
在这里插入图片描述


(四)接长数组

最后这种方法并不是求字符串左旋而是判断字符串str是否是字符串arr左旋后的结果,
这里我们就不走常规路线了,直接找特殊:
我们可以将arr接长,来判断str是否是arr接长后的子串。

图解:
在这里插入图片描述

代码如下:

#include<stdio.h>
#include<assert.h>
#include<string.h>
#include<stdlib.h>int judge(char* arr, char* str)
{assert(arr && str);int len_arr = strlen(arr);int len_str = strlen(str);if (len_arr != len_str)//长度不同就肯定不会是旋转字符串return 0;memcpy(arr + len_arr, arr, len_arr);if (strstr(arr, str) != NULL)return 1;elsereturn 0;
}int main()
{char str[20] = { 0 };char arr[40] = { 0 };printf("请输入字符串1:");scanf("%s", str);printf("请输入字符串2:");scanf("%s", arr);if (judge(arr, str) != 0)printf("true\n");elseprintf("false\n");return 0;
}

运行实例:
在这里插入图片描述


总结

以上就是关于旋转字符串的全部内容,如果有什么疑问或者建议都可以在评论区留言,感谢大家的支持,欢迎来评论区一起探讨,大家的鼓励是在这里插入图片描述继续更新的巨大动力。


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

相关文章

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; 发现…

CPU使用率到100%,有哪些因素影响?

关注星标公众号&#xff0c;不错过精彩内容 转自 | 涛哥依旧 最近&#xff0c;一位同事急匆匆跑过来跟我说&#xff1a;糟糕了&#xff0c;服务器CPU的使用率达100%了。 我心想不可能啊&#xff0c;CPU有那么多核&#xff0c;怎会跑满&#xff1f;于是看了一眼&#xff0c;结果…

记一次golang cpu 占用100%

最近重新部署了下测试服务器&#xff0c;发现其负载达到了4.*&#xff0c; cpu 使用率达到了100%&#xff0c;吓的瑟瑟发抖&#xff0c;马上起来查看情况。 1&#xff0c; 想到了使用go性能查看工具&#xff1a; pprof&#xff0c;因为项目是用gin开发的&#xff0c;所在直接安…