解题 - 左旋字符串的三种解法(思路)

news2024/11/20 13:26:31

文章目录

前言:

题干:

解题思路:

思路一:

思路二:

思路三:

小结


前言:

路漫漫其修远兮,吾将上下而求索。


  • 题干:

  • 解题思路:

创建变量k ,用户可输入;由于 k 不受字符串中字符个数的限制,且如若一个字符串中有6个字符,那么当 k = 7;时,其旋转的结果和 k = 1;时的结果相同;所以在写函数的时候,要将 k % (字符串字符个数) 以得到有效的左旋次数;

  • 思路一:

左旋一次就意味着要将此字符串中前一个字符移动到末尾,剩下的字符往前移动;同理,将前面的动作执行两次便是左旋两次的效果;

将第一个字符存到临时变量tmp 中,剩下的字符在循环的作用下,后一个字符分别”冒泡“赋给前一个字符,操作方向:从前往后;

图解如下:

代码如下:

#include<stdio.h>

void LeftRound(char* str,int k)
{
	int len = strlen(str);
	int time = k % len;
	int i = 0;
	while (time--)//控制左旋次数
	{

		char tmp = *str;//保留第一位
		for (i = 0; i < len - 1; i++)//每一次左旋
		{
			*(str + i) = *(str + i + 1);
		}
		*(str + len - 1) = tmp;//将第一位放到此字符串的最后一位上
	}
}
//
//当然,由于编译器访问数组的本质是利用地址,此处方便理解也可以使用下标的方式来进行访问
//数组名为其首元素地址,而str 接收的为数组ch的首元素地址;同理,str 也可以当作数组名来使用,即将 *(str + i) 写作 str[i];
//
void LeftRound(char* str, int k)
{
	int len = strlen(str);
	int time = k % len;
	int i = 0;
	while (time--)//控制左旋次数
	{

		char tmp = *str;//保留第一位
		for (i = 0; i < len - 1; i++)//每一次左旋
		{
			str[i] = str[i+1];
		}
		str[len-1] = tmp;//将第一位放到此字符串的最后一位上
	}
}

int main()
{
	int k = 0;
	scanf("%d", &k);
	char ch[] = "ABCDEF";
	LeftRound(ch,k);

	printf("%s\n", ch);
	return 0;
}

代码运行结果如下:

  • 思路二:

实际上,我们可以将实际左旋的字符个数后面的字符拷贝到一个足够大的新数组中,然后再将需要左旋的字符拼接到新数组字符的结尾;最后再将新数组中拼接好的字符串拷贝到原来的数组中去;

图解如下:

此处需要用到的拷贝库函数 :strcpy 与 拼接库函数:strncat 

两库函数的具体信息如下:

代码如下:

#include<stdio.h>
#include<string.h>

void LeftRound(char* str, int k)
{
	int len = strlen(str);
	int time = k % len;
	char tmp[256] = { 0 };

	strcpy(tmp, str+time);
	strncat(tmp, str, time);
	strcpy(str, tmp);
}
int main()
{
	int k = 0;
	scanf("%d", &k);
	char ch[] = "ABCDEF";
	LeftRound(ch,k);

	printf("%s\n", ch);
	return 0;
}

代码运行结果如下:

  • 思路三:

在思路2里,于函数栈帧中创建一个足够大的数组来拷贝、拼接目标字符串在时间与空间上均有开销;于是乎,我们就想有没有什么巧妙地方法,既不用循环多次,也不用创建新数组;

例如,字符串为"ABCDEF",k = 2; 时,其左旋地结果为 ”CDEFAB“,观察所得结果可知,左旋地结果是将前k个字符按照原来的顺序放在整个字符串地末尾,剩下的字符便按照原来的顺序被顶到了前面;一个字符串翻转两次(同种样式反转)可以回到原来的样子;例如:将ABC 翻转--> 得到 CBA --> 再翻转一次,得到 ABC ;

同理,我们将上述例子中的AB 当作一个字符 R,CDEF当作一个字符T;所得结果无非就是RT 翻转一下得到的--> TR ,但是得保证T、R 中的字符顺序不变,显然就让它翻转两次就行了;即一次局部翻转+一次整体翻转 ;

图解如下:

代码如下:

#include<stdio.h>
#include<string.h>

void reverse(char* left, char* right)
{
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;

		//调整
		left++;
		right--;
	}
}

void LeftRound(char* str, int k)
{
	int len = strlen(str);
	int time = k % len;
	reverse(str, str + time - 1);
	reverse(str+time, str+len-1);
	reverse(str, str+len - 1);
}
int main()
{
	int k = 0;
	scanf("%d", &k);
	char ch[] = "ABCDEF";
	LeftRound(ch,k);

	printf("%s\n", ch);
	return 0;
}

代码运行结果如下:

  • 小结

思路一:循环;创建临时变量来支持整个数组的前移;

思路二:利用库函数strcpy 与 strncat +创建一个足够大的数组

思路三:发现规律;翻转的巧妙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978935.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【知识专栏丨python数分实战】关于电商零售客户细分数据分析及可视化

今天这篇文章将给大家介绍关于电商零售客户细分数据分析及可视化的案例分析。 01 数据整理 导入数据 import pandas as pdimport numpy as npfrom pyecharts.charts import *import pyecharts.options as opts import warningswarnings.filterwarnings(ignore) 数据读取及预…

shell的基础介绍

文章目录 shell数组读取数组关联数组获取数组的长度 Shell运算符算术运算符关系运算符布尔运算符逻辑运算符字符串运算符文件测试运算符 Shell echo命令1.显示普通字符串2.显示转义字符3.显示变量4.显示换行5.显示不换行6.显示结果定向至文件7.原样输出字符串&#xff0c;不进行…

Macbook上运行Windows系统工具Parallels Desktop19

亲爱的笔记本小能手们&#xff0c;你们是否也有这样的困扰&#xff1a;在Macbook上运行Windows系统&#xff0c;却发现虚拟机软件要么卡顿&#xff0c;要么操作复杂&#xff1f;别急&#xff0c;今天就给你们种草一款神器——Parallels Desktop 19。 Parallels Desktop最新绿色…

无人机工程师技术高级证书详解

随着无人机技术的飞速发展&#xff0c;其在航拍、农业、测绘、救援、物流等多个领域的应用日益广泛&#xff0c;对无人机工程师的专业技能与综合素质提出了更高要求。无人机工程师技术高级证书&#xff0c;作为对无人机领域高级工程师专业技能的权威认证&#xff0c;不仅是对个…

QT网络编程

Qt 给用户提供了网络编程的接口&#xff0c;包括TCP、UDP、HTTP三种协议的API以及各种类&#xff0c;可以了解一下。 而在 QT 中想要使用网络编程&#xff0c;必须在pro文件中添加 network 模块&#xff0c;否则无法包含网络编程所需的头文件。 UDP UDP是传输层的协议&#…

Animate软件基础:在时间轴中标识动画

FlashASer&#xff1a;AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer&#xff1a;实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 FlashASer&#xff1a;Animate教程及作品源文件https://zhuanlan.zhihu.co…

实战项目导航

目录 1.AI毕设生成器&#xff08;完善中&#xff09;2.计算机设计大赛案例3.c迷宫游戏4.python学生管理系统教学关注持续更新哦 1.AI毕设生成器&#xff08;完善中&#xff09; 文章链接 &#x1f680; 一键启航&#xff0c;编码从未如此简单&#xff01; 探索Python毕业设计生…

vulnhub之serial

这次我们来做这个靶场 项目地址https://download.vulnhub.com/serial/serial.zip 使用vm新建虚拟机 以下为注意事项 第一步&#xff0c;收集资产 扫描靶场ip netdiscover -i eth0 -r 192.168.177.0/24 抓个包 扫描目录 看到了cookie中有一个user Tzo0OiJVc2VyIjoyOntzOj…

【Golang 面试 - 进阶题】每日 3 题(十八)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

算法:BFS 解决拓扑排序

目录 拓扑排序 题目一&#xff1a;课程表 题目二&#xff1a;课程表II 题目三&#xff1a;火星词典 拓扑排序 有向无环图(DAG图) 有向无环图也就是有几个点&#xff0c;每个点之间的线段都是有向的&#xff0c;且任意拿出来几个点&#xff0c;都是无环的&#xff0c;这里…

Adaboost集成学习 | Matlab实现基于ELM-Adaboost极限学习机结合Adaboost集成学习故障诊断

目录 效果一览基本介绍程序设计参考资料效果一览 基本介绍 Adaboost集成学习 | Matlab实现基于ELM-Adaboost极限学习机结合Adaboost集成学习故障诊断 ELM(Extreme Learning Machine)和 Adaboost 都是机器学习领域中常见的算法。ELM 是一种单隐层前馈神经网络,具有快速训练、…

使用 1panel面板 部署 springboot 和 vue

代码仓库&#xff1a;还没弄 目录 网站介绍安装步骤1. 准备云服务器2. 准备域名&#xff08;可跳过&#xff09;3. 安装1panel面板4. 服务器开放端口5. 进入1panel面板6. 安装并启动软件&#xff08;服务器和面板开放端口&#xff09;7. 打包并上传项目7.1 打包 Java项目&#…

算力共享中神经网络切片和算力分配策略

目录 神经网络切片 按照算力的分布进行网络层数切片;就是算力越强,运算神经网络层数越多 神经网络切片和算力占比进行映射 算力分配策略 get_current_shard 神经网络切片 按照算力的分布进行网络层数切片;就是算力越强,运算神经网络层数越多 神经网络切片和算力占比进…

基于RK3588+AI支持能源在线监测系统应用的AIOT产品方案

支持能源在线监测系统应用的AIOT产品方案 近年来&#xff0c;智慧能源行业受益于国家政策扶持、市场需求拉动和先进技术支撑呈现出了蓬勃发展态势。助推智慧能源发展&#xff0c;打造了支持能源在线监测系统应用的AIOT产品方案。 能源在线监测系统的市场潜力 随着社会经济的飞…

C++笔记---类和对象(中)

1. 类的默认成员函数 默认成员函数就是用户没有显式实现&#xff0c;编译器会自动生成的成员函数称为默认成员函数。 一个类&#xff0c;我们不写的情况下编译器会默认生成以下6个默认成员函数&#xff0c;分别为&#xff1a;构造函数&#xff0c;析构函数&#xff0c;拷贝构…

【Java】Java swing 民宿管理系统 GUI(源码+可视化界面)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

【vulnhub】W1R3S.inc靶机

靶机安装 下载地址&#xff1a;https://download.vulnhub.com/w1r3s/w1r3s.v1.0.1.zip 运行环境&#xff1a;vmware 信息收集 靶机发现IP扫描 nmap 192.168.93.0/24 端口扫描,发现开放21、22、80、3306端口 nmap -A 192.168.93.159 -p- 进行目录扫描 dirsearach -u http…

函数实例讲解(三)

文章目录 常用的三个数学函数1、绝对值函数ABS2、取整数部分INT3、求余数函数MOD 求极值函数max、min1、Max2、Min 附加条件下求平均数1、AVERAGE2、AVERAGEIF3、AVERAGEIFS VLOOKUP与COLUMN1、VLOOKUP2、COLUMN 查找函数LOOKUP1、基础语法2、向量形式3、数组形式 常用的三个数…

Odoo生产执行(MES)系统管理解决方案简介

什么是生产执行管理解决方案&#xff1f; Odoo生产执行管理解决方案可以在统一平台上集成诸如生产调度、产品跟踪、质量控制、设备故障分析、网络报表等管理功能&#xff0c;使用统一的数据库和通过网络联接可以同时为生产部门、质检部门、工艺部门、物流部门等提供车间管理信息…

windows 部署 mindspore GPU 开发环境(WSL)

基础环境 windows 环境&#xff1a; Windows 10 版本&#xff1a;22H2 操作系统版本&#xff1a;22621.2283 WSL 系统 版本&#xff1a;2.2.4.0 Ubuntu-20.04 一、自定义位置安装Ubuntu 确保已经安装 WSL 在微软应用商店搜索时务必输入全名 Ubuntu20.04&#xff0c;并安装…