当前位置: 首页 > news >正文

力扣旋转字符串

在这里插入图片描述

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏: 🍔🍟🌯 c语言初阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:介绍字符串旋转,左旋,右旋即旋转结果.
金句分享:
✨好好干,日子会越来越甜。✨

目录

  • 一、轮转数组
    • 方法一:暴力解题:
    • 方法二:三步翻转法.
  • 二.左旋转字符串
  • 三:字符串旋转结果
    • 思路一:
    • 思路2:

一、轮转数组

题目链接:(来源于力扣)(右旋)
给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
示例 1:

输入: nums = [1,2,3,4,5,6,7], k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右轮转 1 步: [7,1,2,3,4,5,6]
向右轮转 2 步: [6,7,1,2,3,4,5]
向右轮转 3 步: [5,6,7,1,2,3,4]

方法一:暴力解题:

一位一位的移动,用循环完成移动一位的操作,一次交换相邻两个数.
例如:右移一位
数据:1 2 3 4 5 6 7
图解:

		右移一位过程图:
//右移一位操作for (i = numsSize - 1; i > 0; i--){int tmp = nums[i];nums[i] = nums[i - 1];nums[i - 1] = tmp;}

右移k位(外层加一个k次循环)
注意:如果移动的位数是数字个数的整数倍数,则相当于没有移动,用k%numsSize可以避免没有必要的多余循环.

void rotate(int* nums, int  numsSize, int k)//外层循环
{int i = 0;k = k % numsSize;while (k--){for (i = numsSize - 1; i > 0; i--)//内部循环{//交换int tmp = nums[i];nums[i] = nums[i - 1];nums[i - 1] = tmp;}}
}

小改进:
将内部的每次循环都要创建变量进行交换,改成直接覆盖,将最后一位数字拷贝一份后,将前面的数据直接向后面覆盖,最后将首位数据赋值为拷贝的最后一位数值也可以完成操作.

图解:

代码:

void rotate(int* nums, int numsSize, int k) {int i = 0;k = k % numsSize;while (k--){int tmp = nums[numsSize - 1];//最后一位数字拷贝一份for (i = numsSize - 1; i > 0; i--)//内部循环{nums[i] = nums[i - 1];//前面的数据直接向后面覆盖}nums[0] = tmp;//首位数据赋值为拷贝的最后一位数}}

但是,暴力解决,在面对大量的数据时,运行速度会慢很多,

方法二:三步翻转法.

其实有一个很神奇的现象,当我们需要右轮转 k 个位置时,可以将这个整形数组看作两部分
前半部分是:前n-k个数据,下标为[0,numsSize - k-1]
后半部分是:最后的k个数据,下标为:[numsSize - k,numsSize - 1]
然后分别逆序两部分,最后整体逆序就行了.
例如:数据1 2 3 4 5 6 7
逆序前半部分:4 3 2 1 5 6 7
逆序后半部分:4 3 2 1 7 6 5
逆序全部: 7 6 5 1 2 3 4

void reverse(int *arr,int left,int right)
{while(left<right){int tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}
}
void rotate(int* nums, int numsSize, int k){if(numsSize==0){return nums;}k = k % numsSize;reverse(nums, 0, numsSize - k-1);//逆序前半部分reverse(nums, numsSize - k, numsSize - 1);//逆序后半部分reverse(nums, 0, numsSize - 1);//逆序整体
}

二.左旋转字符串

传送门:
题目描述:
一个给定的字符序列 S ,请你把其循环左移 K 位后的序列输出
示例1:

输入:
“abcXYZdef”,3

返回值:
“XYZdefabc”

学完上面的数组右旋,相信左旋字符串应该可以照猫画虎吧!

同理使用:三步翻转法

 #include <string.h>
void reverse(char *arr,int left,int right)
{while(left<right){char tmp = arr[left];arr[left] = arr[right];arr[right] = tmp;left++;right--;}
}
char* LeftRotateString(char* nums, int k ) {int sz=strlen(nums);if(sz==0){return nums;}k = k % sz;reverse(nums, 0, k-1);reverse(nums, k, sz - 1);reverse(nums, 0, sz - 1);return nums;
}

三:字符串旋转结果

题目描述:
自定义一个函数,要求判断一个字符串是否为另外一个字符串旋转之后的字符串。
要求这两个字符串长度相等.
返回值:
是: 返回1
不是:返回0.

示例1:

给定字符串s1 =AABCD和字符串s2 = BCDAA
s1左旋2个数后可以得到s2,所以结果为真,返回1;

示例2:

给定s1=abcd和s2=ACBD,
s1无法通过旋转得到,s2.结果为假,返回0;

思路一:

通过计算字符串长度得到sz,然后循环旋转sz次,每次旋转后与s2进行比较.

#include <stdio.h>
#include <string.h>
#include <assert.h>
void reversed(char* left,char* right)
{assert(left);//防止传入空指针assert(right);while (left < right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}
}
void left_revolve(char*arr,int k)
{int sz = strlen(arr);k %= sz;//逆序前k个reversed(arr, arr+k-1);//逆序后面剩下的reversed(arr+k, arr+sz-1);//逆序整体reversed(arr, arr + sz - 1);
}
int is_revolve(char* s1, char* s2, int sz)
{int i = 0;for (i = 0; i < sz; i++){left_revolve(s1, 1);if (strcmp(s1, s2) == 0){	return 1;}}return 0;
}
int main()
{char s1[50] = { 0 };char s2[50] = { 0 };gets(s1);gets(s2);int sz = strlen(s1);int ret = is_revolve(s1, s2, sz);printf("%d", ret);return 0;
}

思路2:

创建一个临时字符数组(tmp),将s1字符串拷贝两份存入临时字符数组.
使用strstr函数,判断字符串s2是否为tmp的字串.

涉及库函数:
strcmp函数:字符串拷贝函数
strcat函数:字符串追加函数
strstr函数:查找子字符串函数.

这些字符串操作函数会在后续更新其使用方法,参数,以及模拟实现.
在这里插入图片描述

#include <stdio.h>
#include <string.h>
#include <assert.h>
#define Max 100//定义零时字符串的最大长度
int is_revolve(const char* s1, char* s2,int sz)
{assert(s1 && s2);char tmp[Max];strcpy(tmp, s1);//将字符串1拷贝一份放入零时数组中strcat(tmp, s1);//使用字符串连接函数,将两个s1连接在一起if (strstr(tmp, s2) != NULL)//如果strstr函数返回的地址不是NULL说明,含有子字符串.{return 1;}else 0;//否则没有子字符串.}
int main()
{char s1[50] = { 0 };//创建字符串s1char s2[50] = { 0 };//创建字符串s2;gets(s1);//获取字符串1gets(s2);//获取字符串2int sz = strlen(s1);//计算字符串长度int ret = is_revolve(s1, s2, sz);printf("%d", ret);return 0;
}

相关文章:

力扣旋转字符串

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f; c语言初阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:介绍字符串旋转,左旋,右旋即旋转结果. 金句分享: ✨好好干&…...

Java 代码组织机制

包 使用任何语言进行编程都有一个相同的问题&#xff0c;就是命名冲突。 包类似于计算机中的文件夹&#xff0c;正如文件放在文件夹中&#xff0c;类和接口放在包中&#xff0c;为便于组织&#xff0c;文件夹一般是一个层次结构&#xff0c;包也类似。 包有包名&#xff0c;…...

【剧前爆米花--爪哇岛寻宝】MySQL中索引和事务

作者&#xff1a;困了电视剧 专栏&#xff1a;《MySQL数据库》 文章分布&#xff1a;这是一篇关于Java中异常类的文章&#xff0c;在本篇文章中详细讲解了异常的使用逻辑和底层的执行过程&#xff0c;如有疏漏&#xff0c;欢迎大佬指正&#xff01; 目录 索引 用法 底层逻辑…...

C++ 线程库

文章目录thread 创建mutexmutexrecursive_mutextimed_mutexlock_guard原子操作atomic条件变量condition_variable其他线程安全问题shared_ptr单例模式C 线程库是 C11 标准中引入的一个特性&#xff0c;它使得 C 在语言级别上支持多线程编程&#xff0c;不需要依赖第三方库或操作…...

python字典和集合——笔记

一、介绍 1、泛映射类型 collections.abc模块中有Mapping和MutableMapping这两个抽象基类&#xff0c;它们的作用是为dict和其他类似的类型定义形式接口&#xff08;在Python 2.6到Python 3.2的版本中&#xff0c;这些类还不属于collections.abc模块&#xff0c;而是隶属于coll…...

TEX:显示文本

文章目录字体选择字体fontspec宏包根据字体形状控制字体为不同的字体形状选择不同的特征为不同的字体大小状选择不同的特征中文字体选择xeCJK宏包字体选择与设置XELATEX字体名查找字体集与符号居中与缩进居中单边调整两边缩进诗歌缩进列表itemize样例enumerate样例description样…...

SS-ELM-AE与S2-BLS相关论文阅读记录

Broad learning system for semi-supervised learning 摘要&#xff1a;本文认为&#xff0c;原始BLS采用的稀疏自编码器来生成特征节点是一种无监督学习方法&#xff0c;这意味着忽略了标注数据的一些信息&#xff0c;并且难以保证同类样本之间的相似性和相邻性&#xff0c;同…...

ESP32设备驱动-MAX6675冷端补偿K热电偶数字转换器

MAX6675冷端补偿K热电偶数字转换器 1、MAX6675介绍 MAX6675执行冷端补偿并将来自K型热电偶的信号数字化。 数据以 12 位分辨率、SPI™ 兼容的只读格式输出。 该转换器可将温度解析为 0.25C,读数高达 +1024C,并且在 0C 至 +700C 的温度范围内具有 8 LSB 的热电偶精度。 MAX…...

Python基础知识汇总(字符串四)

目录 字母的大小写转换 lower()方法 upper()方法 删除字符串中的空格和特殊字符 strip()方法...

C语言学习笔记——指针(初阶)

前言 指针可以说是C语言基础语法中最难的理解的知识之一&#xff0c;很多新手&#xff08;包括我&#xff09;刚接触指针时都觉得很难。在我之前发布的笔记中都穿插运用了指针&#xff0c;但是我一直没有专门出一期指针的笔记&#xff0c;这是因为我确实还有些细节至今还不太清…...

阿赵的MaxScript学习笔记分享十二《获取和导出各种数据》

大家好&#xff0c;我是阿赵&#xff0c;周日的早上继续分享MaxScript学习笔记&#xff0c;这是第十二篇&#xff0c;获取和导出各种数据 1、导出数据的目的 使用3DsMax建立3D模型后&#xff0c;很多时候需要输出模型到别的引擎去使用&#xff0c;常用的格式有Obj、FBX、SLT等…...

react-draggable实现拖拽详解

react-draggable属性常用属性属性列表事件列表举例首先安装 react-draggable实现移动希望小编写的能够帮助到你&#x1f618;属性 常用属性 属性默认值介绍axisxhandle拖动的方向&#xff0c;可选值 x ,y,bothhandle无指定拖动handle的classposition无handle的位置&#xff0…...

01.进程和线程的区别

进程和线程的区别进程和线程是计算机中的两个核心概念&#xff0c;它们都是用来实现并发执行的方式&#xff0c;但是它们在实现并发的方式和资源管理方面有一些重要的区别。进程是一个程序的运行实例。每个进程都有自己的内存空间、代码、数据和系统资源&#xff08;如文件描述…...

逻辑优化-rewrite

简介 逻辑综合中的rewrite算法是一种常见的优化算法&#xff0c;其主要作用是通过对逻辑电路的布尔函数进行等效变换&#xff0c;从而达到优化电路面积、时序和功耗等目的。本文将对rewrite算法进行详细介绍&#xff0c;并附带Verilog代码示例。 一、算法原理 rewrite算法的…...

文件传输与聊天系统设计

技术&#xff1a;Java等摘要&#xff1a;本文介绍了一种基于TCP/IP协议使用Socket技术实现的聊天室系统&#xff0c;包括私聊功能和文件传输功能&#xff0c;对系统的主要模块进行了分析&#xff0c;并对系统实现过程中遇到的关键性技术进行了阐述&#xff0c;最后对系统进行了…...

蓝桥杯第十四届校内赛(第三期) C/C++ B组

一、填空题 &#xff08;一&#xff09;最小的十六进制 问题描述   请找到一个大于 2022 的最小数&#xff0c;这个数转换成十六进制之后&#xff0c;所有的数位&#xff08;不含前导 0&#xff09;都为字母&#xff08;A 到 F&#xff09;。   请将这个数的十进制形式作…...

有关平方或高次方的公式整理一元高次方程的求解

Part.I Introduction 这篇博文记录一下数学中常用的有关平方或高次方的一些公式。 Chap.I 一些结论 下面一部分汇总了一些重要的结论 完全平方公式&#xff1a;(ab)2a22abb2(ab)^2a^22abb^2(ab)2a22abb2平方差公式&#xff1a;a2−b2(ab)(a−b)a^2-b^2(ab)(a-b)a2−b2(ab)(…...

Java笔记3

ArrayListArrayList<String> list new Arraylist<>();<>是泛型表示存放的数据类型&#xff0c;注意不能是基本数据类型&#xff1b;增删改查增&#xff1a;add 返回值为true删&#xff1a;remove 1.直接删元素2.根据索引删元素改&#xff1a;set&#xff08…...

Leetcode.2202 K 次操作后最大化顶端元素

题目链接 Leetcode.2202 K 次操作后最大化顶端元素 Rating &#xff1a; 1717 题目描述 给你一个下标从 0开始的整数数组 nums&#xff0c;它表示一个 栈 &#xff0c;其中 nums[0]是栈顶的元素。 每一次操作中&#xff0c;你可以执行以下操作 之一 &#xff1a; 如果栈非空…...

JAVA知识点全面总结3:String类的学习

三.String类学习 1.String&#xff0c;StringBuffer&#xff0c;StringBuilder的区别&#xff1f; 2.字符串拼接用加号的原理 &#xff1f; 3.字符串常量池如何理解&#xff1f; 4.String的intern方法理解&#xff1f; 5.String的equals方法和compareTo方法的使用&#xf…...

C++实现分布式网络通信框架RPC(3)--rpc调用端

目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中&#xff0c;我们已经大致实现了rpc服务端的各项功能代…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...