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

C:每日一题:字符串左旋

题目:实现一个函数,可以实现字符串的左旋

例如:ABCD左旋一个字符就是BCDA;ABCD左旋两个字符就是CDAB;

1、解题思路:

1.确定目标旋转k个字符,我们要获取字符串的长度 len,目的是根据长度来处理 k 可能超出字符串长度的情况;

2.创建一个函数 left 来实现字符串左旋;

3.对k进行取模运算:k%=len,该表达式目的是计算实际旋转次数。假设字符串长度是 5,而要左旋 7 个字符,实际上相当于左旋 7 % 5 = 2 个字符。

4.创建一个临时数组 temp 来存放要左旋的 k 个字符,防止后续移动字符串时数据丢失。

5.使用 strncpy 将字符串前 k 个字符复制到 temp 中,使用 memmove 函数移动字符串,把从第 k 个字符开始的部分向前移动 k 个位置。(等会简单介绍一下函数的使用)

6.使用 strncat 函数将保存在 temp 中的前 k 个字符拼接到移动后的字符串后面,完成左旋操作。

2、知识补充:

注:这里就简单介绍一下用法,能让大家读懂我后面写的代码,后面会专门出一篇文章来介绍这些函数。以下介绍的函数使用都需要加上头文件<string.h>

1、strncpy

strncpy是字符串复制函数,作用是将指定数量的字符从源字符串复制到目标字符串。

函数原型:char *strncpy(char *dest, const char *src, size_t n)

  • dest:目标字符串。
  • src :源字符串。
  • n :要复制的最大字符数。

使用:

#include <stdio.h>
#include <string.h>
int main() {char dest[10];char src[] = "Hello";strncpy(dest, src, 2);  // 复制 src 的前 2 个字符到 destdest[2] = '\0';  // 手动添加字符串结束符printf("%s\n", dest);  // 输出 "He"return 0;
}

2.memmove

memmove是内存操作函数,作用是将 n个字节的数据从 src 所指向的内存区域复制到 dest 所指向的内存区域,可以处理源内存区域和目标内存区域重叠的情况,保证正确地复制数据。

函数原型:void *memmove(void *dest, const void *src, size_t n)

  • dest:指向目标内存区域的指针,数据将被移动到这里。
  • src:指向源内存区域的指针,数据将从此处移动。
  • n :要移动的字节数。

使用:

#include <stdio.h>
#include <string.h>int main() {char str[] = "HelloWorld";memmove(str + 5, str, 5);printf("%s\n", str); return 0;
}

3.strncat 

 strncat是字符拼接函数,作用是将源字符串 scr 中的最多 n 个字符拼接到目标字符串 dest 的末尾,并在拼接后的字符串末尾自动添加字符串结束符 '\0'

函数原型:char *strncat(char *dest, const char *src, size_t n)(同上)

使用:

#include <stdio.h>
#include <string.h>int main() {char dest[20] = "Hello, ";char src[] = "World!";strncat(dest, src, 5);  // 拼接 src 的前 5 个字符printf("%s\n", dest);  // 输出 "Hello, World"return 0;
}

3、代码展示及解析:

#include <stdio.h>
#include <string.h>
void left(char* str, int k)//完成字符左旋操作
{int len = strlen(str);k %= len;//实际左旋次数char temp[2];//这里使用2表示是因为在vs2022上表达式必须含有常量值strncpy(temp, str, k);//复制要左旋的k个字符到临时数组temp中memmove(str, str + k, len - k);//移动字符串str[len - k] = '\0';//确保完整性strncat(str, temp, k);//将存储在 temp 中的前 k 个字符拼接到移动后的字符串后面
}
int main()
{char str[] = "abcd";int k = 2;//左旋个数为2printf("左旋前:%s\n", str);left(str, k);//实现左旋操作的函数调用printf("左旋后:%s\n", str);return 0;
}

char temp[2]这是由于vs2022不支持变长数组才这样写的代码,如果你所使用的编译器支持边长数组,可以改进一下代码

代码改进:

#include <stdio.h>
#include <string.h>
void left(char* str, int k)
{int len = strlen(str);k %= len;char temp[k];//变长数组strncpy(temp, str, k);memmove(str, str + k, len - k);str[len - k] = '\0';strncat(str, temp, k);
}
int main()
{char str[] = "abcd";int k = 2;printf("左旋前:%s\n", str);left(str, k);printf("左旋后:%s\n", str);return 0;
}

 

如果在支持变长数组,这样写代码会更加的方便,你只需要修改所输入k的值就可以实现左旋不同个字符,例如:输入k=1,左旋一个字符;输入k=2,左旋两个字符。

4、不使用这些库函数来实现字符串左旋

代码及注释:(这个是结合老师的讲解所写的)

#include <stdio.h>
// 左旋字符串函数
void left(char* str, int k)
{int len = 0;  // 存储字符串长度char* p = str;  //遍历字符串计算长度while (*p) // 计算字符串长度{len++;p++;}k %= len;  // 实际左旋次数for (int i = 0; i < k; i++)  // 进行左旋操作{char temp = *str;  // 保存字符串要左旋的k个字符  for (int j = 0; j < len - 1; j++)  // 将字符串从第二个字符开始依次向前移动一位{*(str + j) = *(str + j + 1);}*(str + len - 1) = temp;  // 将保存的k个字符放到字符串尾部}
}
int main() 
{char str[] = "ABCD";int k = 2;printf("左旋前: %s\n", str);left(str, k);printf("左旋后: %s\n", str);return 0;
}

相关文章:

C:每日一题:字符串左旋

题目&#xff1a;实现一个函数&#xff0c;可以实现字符串的左旋 例如&#xff1a;ABCD左旋一个字符就是BCDA&#xff1b;ABCD左旋两个字符就是CDAB&#xff1b; 1、解题思路&#xff1a; 1.确定目标旋转k个字符&#xff0c;我们要获取字符串的长度 len&#xff0c;目的是根…...

深兰科技荣获2024年度金势奖“AI出海先锋品牌”金奖

近日&#xff0c;由金势奖组委会、凤凰网、营销国际协会等国内外知名机构、集团共同主办的“第四届未来营销大会暨锐品牌盛典”在上海举行。大会揭晓了第四届“金势奖锐品牌大赏”奖项的评选结果&#xff0c;深兰科技凭借自身在机器人产品出口和海外市场开拓等出海全球化发展方…...

服务器启动jar包的时候报”no main manifest attribute“异常(快捷解决)

所以,哥们,又出现问题咯.没事,我也出现了,哈哈哈哈哈,csdn感觉太麻烦了,所以搞了一篇这个. 没得事,往下看,包解决的. 希望可以帮助到各位&#xff0c;感谢阅览&#xff01; 小手点个赞&#xff0c;作者会乐烂哈哈哈哈哈哈&#x1f606;&#x1f606;&#x1f606;&#x1f606…...

部分控件的setText文案没有出现在retranslateUi()中,多语言切换不生效问题

问题&#xff1a;在designer中设计UI&#xff0c;我从其他ui文件copy了部分控件&#xff0c;新ui文件重新编译生成后&#xff0c;setText&#xff08;&#xff09;并没有出现在新文件的retranslateUi()函数中&#xff0c;导致多语言切换不生效。 void retranslateUi(QWidget * …...

ubuntu系统下安装LNMP集成环境的详细步骤(保姆级教程)

php开发中集成环境的安装是必不可少的技能,而LNMP代表的是:Linux系统下Nginx+MySQL+PHP这种网站服务器架构。今天就给大家分享下LNMP的安装步骤。 1 Nginx安装 在安装Nginx前先执行下更新命令: sudo apt-get update 接下来开始安装Nginx, 提示:Could not get lock /v…...

化繁为简:揭秘中介者模式在Java设计中的魅力与力量

中介者模式是一种行为型设计模式&#xff0c;它通过引入一个中介者对象来简化多个对象之间的交互&#xff0c;从而降低它们之间的耦合度。在Java设计模式中&#xff0c;中介者模式扮演着重要的角色&#xff0c;特别是在处理复杂系统模块间的交互时。下面对Java设计模式之中介者…...

Postgresql导入矢量数据

前期准备 工具&#xff1a;PgAdmin&#xff0c;postgis-bundle Postgres安装和postgis安装可以百度别的教程。 创建数据库添加扩展 如图&#xff0c;使用PgAdmin创建名为shp的数据库&#xff0c;并在扩展item中添加postgis扩展。 添加扩展方法可以用查询工具输入以下sql语句&…...

二叉树拙见

1.树的概念及结构 1.1树的概念&#xff1a; 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 &#xff0…...

APT 组织 Kimsuky 瞄准大学研究人员

执行摘要 Kimsuky 是一个朝鲜 APT 组织&#xff0c;其任务是执行符合朝鲜政府利益的全球情报收集行动。该组织自 2012 年以来一直活跃&#xff0c;对韩国智库和政府实体特别感兴趣&#xff1b;然而&#xff0c;它也针对美国、英国和其他欧洲国家。Kimsuky 擅长进行有针对性的网…...

Golang | Leetcode Golang题解之第327题区间和的个数

题目&#xff1a; 题解&#xff1a; import "math/rand" // 默认导入的 rand 不是这个库&#xff0c;需要显式指明type node struct {ch [2]*nodepriority intkey intdupCnt intsz int }func (o *node) cmp(b int) int {switch {case b < o.k…...

Django5实战

一、安装&#xff1a; 1、安装Django环境&#xff1a; # 安装 pip install django5.0.3# 验证 5.0.3 python -m django --version 安装慢的解决方法&#xff1a;使用阿里云的镜像源 pip install -i https://mirrors.aliyun.com/pypi/simple django5.0.3 2、创建项目&#…...

网址管理功能 Webstack

前言 在工作生活中大家可能会收集各种网址地址&#xff0c;大部分同学都是通过浏览器标签进行管理。如果你换电脑或者电脑不再身边的时候就有些不方便了。接下来我要向大家推荐一个工具&#xff1a;在线网址导航。 CNS学术导航 大家通过搜索引擎可以很方便的搜索到各种网址导航…...

【热工与工程流体力学】第1章 流体及其主要物理性质,流体的粘性,压缩性,流体的质量力和表面力(西北工业大学)

第1章 流体及其主要物理性质 一、流体力学概述 二、流体力学发展简史 三、本课程的教学计划 四、连续介质模型 五、流体的主要物理性质 六、作用在流体上的力 七、本课程中使用的单位制 一、流体力学概述 1.流体的概念 在任何微小剪应力持续作用下连续变形的物质称为流…...

TCP和UDP区别,各自的应用场景

区别 是否基于链接 TCP是面向连接的协议&#xff0c;发送数据之前需要建立连接&#xff1b;而UDP是无连接的协议&#xff0c;即发送数据之前不需要简历连接。 可靠性和有序性区别 TCP提供交付保证&#xff0c;&#xff08;TCP通过校验和重传控制&#xff0c;序号表示&#xff…...

Java开发工具IDEA

IDEA概述 Intellij IDEA IDEA全称Intellij IDEA&#xff0c;是用于Java语言开发的集成环境&#xff0c;它是业界公认的目前用于Java程序开发最好的工具。 集成环境 把代码编写&#xff0c;编译&#xff0c;执行&#xff0c;调试等多种功能综合到一起的开发工具。 IDEA下载和安…...

VIVADO IP核之DDS直接数字频率合成器使用详解

VIVADO IP核之DDS直接数字频率合成器使用详解 目录 前言 一、DDS基本知识 二、DDS IP核使用之SIN COS LUT only 三、DDS IP核之SIN COS LUT only仿真 四、DDS IP核使用之Phase Generator and SIN COS LUT 五、DDS IP核之Phase Generator and SIN COS LUT仿真 总结 前言 …...

Vue3 插槽 使用笔记

Vue3 插槽 使用笔记 介绍 在 Vue 3 中&#xff0c;插槽&#xff08;Slot&#xff09;是一个非常强大的特性&#xff0c;它允许我们更好地组织和重用组件。通过定义插槽&#xff0c;子组件可以预留出由父组件控制的区域&#xff0c;这样父组件就可以向这些区域填充自己的内容。…...

Vue2与Vue3响应式原理对比

Vue2.x 响应式原理 Vue2.x 响应式&#xff1a; 实现原理 对象类型&#xff1a;通过 Object.defineProperty() 对属性的读取、修改进行拦截( 数据劫持 )数组类型&#xff1a;通过重写数组方法&#xff0c;并作为拦截器挂载到数组对象与数组原型之间&#xff0c;来实现拦截。 存在…...

Android系统Android.bp文件详解

文章目录 1. 基本语法结构2. 常见模块类型3. 模块属性常见属性包括&#xff1a; 4. 具体示例5. 高级功能5.1. 条件编译5.2. 变量定义与使用5.3. 模块继承 6. 总结 Android.bp 是 Android 构建系统&#xff08;Android Build System&#xff09;中的配置文件&#xff0c;用于描述…...

eNSP 华为静态路由配置

R1&#xff1a; <Huawei>system-view [Huawei]sysname R1 [R1]int g0/0/0 //进入g0/0/0端口 [R1-GigabitEthernet0/0/0]ip address 192.168.1.1 24 //给端口配置IP地址和子网掩码 [R1-GigabitEthernet0/0/0]int g0/0/1 [R1-GigabitEthernet0/0/1]ip addr…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...