数组循环位移

C语言实现-数组移位,前移,后移,整体移动 数组向前移动一个元素,数组向后移动一个元素 有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数 例如有10 阅读详情

设计一个算法 把一个含有N个元素的数组循环右移K位 要求时间复杂度为O(N ) 且只允许使用两个附加变量


方法1:

将长度为N的数组 每次移动一位 移动k次  如abc移动三次 为abc ->cab->bca->abc.  当移动为N此时 与原数组相同 因此 当k>N 时 移动结果与 k%N 相同

	for (int i=0;i<k%N;i++)
	{
		char t=a[0];
		for(int j=0;j<strlen(a)-1;j++)
		{
			a[j]=a[j+1];
		}
		a[strlen(a)-1]=t;
	}

方法2:

将长度为N的数组 (a0,a1,a2...ak) (ak+1,ak+2...aN)循环右移K 位 移动后结果为 (ak+1,ak+2...aN)(a0,a1,a2...ak) 

可以看做是  A=a0,a1,a2...ak,B=ak+1,ak+2...aN 

A逆排序后为 A‘=aK,ak-1,...a0,A‘B 

B逆排序后为B’=aN,aN-1....ak+1,A’B‘

全部逆排序后为BA=ak+1,ak+2....aN,a0,a1....ak


char *xmov(char *a,int k)
{
	char t;
	int kk=k-1;
	for(int i=0,j=kk;i<j ;i++,j--)
	{
		t=a[j];
		a[j]=a[i];
		a[i]=t;
		
	}
	for(int i=k,j=strlen(a)-1;i<j && i<strlen(a);i++,j--)
	{
		t=a[j];
		a[j]=a[i];
		a[i]=t;
	}
	for(int i=0,j=strlen(a)-1;i<j;i++,j--)
	{
		cout<<a[i]<<' '<<a[j]<<endl;
		t=a[i];
		a[i]=a[j];
		a[j]=t;
	}
	return a;
}

方法三:利用gcd 原理 

将a[0]存储到临时变量t  将a[k%n]移动到a[0] 将a[2*k%n] 移动到 a[r%n]。。。。将a[x*k%n]移动到a[(x-1)*k%n] 直到x*k%n==0 将a[x*k/n]=t

如果 该过程不能移动完所有元素 那么需要从a[1]继续移动 总共重复gcd(n,k)次

	int n=gcd(k,strlen(a));
	for( int i=0;i<n ;i++)
	{
		int j=i;
		t=a[j];
		while(1)
		{
			if((j+k)%n== i)
				break;
			else
				a[j]=(j+k)%n;
			j=(j+k)%n;
		}
		a[j]=t;  
	}



[Leetcode][Rotate Array]一种对连续内存空间进行的循环移位的巧妙解法(O(1)的空间、O(n)的时间) 本文最初发表:http://03071344.lofter.com/post/10871e_2c4556 本文讨论如何对一段连续的内存空间(如int型数组、char型数组)的内容进行循环移动。例如我们有一个数组,定义如下:int num[9] = {1, 2, 3, 4, 5, 6, 7, 8, 9};现要对num数组的内容循环移动4位。 解法一 我们可以申请4个连续的int变量 阅读详情

相关推荐

[C语言]数组循环位移三种算法--实现与原理

我们可以对比一下这三种算法的优劣,在实际应用中选择合适的算法,三次反转法是最推荐实际应用的算法。算法名称时间复杂度空间复杂度思路简述优点缺点暴力法Op⋅nOp⋅n,最坏On2O(n^2)On2O1O(1)O1重复执行p1p+1p1次单步左移:保存首个元素,其余元素前移,再将保存元素放末尾思路最直观,易于理解和实现效率低,大量重复移动,适合小规模数据临时数组法OnO(n)OnOpO(p)Op或OnO(n)On用临时数组保存前。

HUI-梦苑 1012

数组移位算法

1、用到的相关头文件 #include <stdio.h> 2、数组移位函数简介 void shift(unsigned char shift_value, unsigned char *shift_group, int shift_lenth); 功能: 1.装入一个新的值 2.数组整体左移 3.新的值装入数组的高位地址、低位数组地址丢弃 参数: unsigned char shift_value :要装入数组的新值 unsigned char *shift_group

yuweize520的博客 1370

字符数组循环位移高效算法

/* 2010年考研数据结构综合应用的一道题, * 要求将长度为n的数组做p位循环移位,效率应尽量高。例如将ABCDEFG做3位循环移动(向右) * 结果是EFGABCD。 * 下面这个算法时间复杂度为O(n)空间复杂度为O(1)相当高效。 */ //

关于数组的循环移位

经常可以见到所谓的数组循环移位的问题,那么什么是数组的循环移位呢?数组的循环移位指的是这样一个过程。假设数组构成了一个链环,整个数组作为链环的一个部分存在,那么我们任取这个链环的一部分,可能超过这个数组的长度,也可能小于等于这个数组的长度。现在考虑我们所取的部分长度等于数组的长度,那么它可能是一个完整的链环的一节,但更多情况下,是某一个链环和它相邻链环的一部分。这样得到的部分实际上就是数组循环移位...

weixin_43712228的博客 2542

QT5.14.2离线安装包保姆级教程:断网、选组件、避坑全记录

本文详细介绍了QT5.14.2离线安装包的完整流程,特别针对Windows平台开发者提供断网安装、组件选择及避坑指南。作为QT5系列中最后一个免费离线版本,5.14.2具有免注册、全组件离线安装等独特优势,是开源开发者的理想选择。文章涵盖从环境准备到安装后配置的全方位指导,帮助开发者高效完成安装并避免常见问题。

weixin_30924087的博客 578

域控制器迁移后NETLOGON共享丢失的修复指南

本文详细解析了在Windows域控制器迁移后NETLOGON共享丢失的故障现象与修复方法。通过使用Dcdiag工具诊断,定位注册表键值SysVolReady异常及SCRIPTS目录缺失等核心原因,并提供了修改注册表、创建目录、重启Netlogon服务等逐步修复指南,帮助管理员快速恢复域用户登录功能,确保业务连续性。

weixin_29245767的博客 88

c语言之实现数组整体移动

需求分析 程序要求有这样五个功能 1:可以打印一个数组 2:可以把一个数组整体左移一位 3:可以把一个数组整体右移一位 4:可以把一个数组整体左移n位 5:可以把一个数组整体右移n位 6:程序需要提供给用户循环使用的功能,当用户输入结束符以后程序结束。 7:程序需要给客户该有的操作提示语 程序分析 程序分析图如下: 主函数调用一个界面函数,界面函数会提供给用户不同的需求,当用户选择不同的时候,会调...

weixin_42452337的博客 1万+

图像去雾新思路:手把手教你复现DEA-Net中的“细节增强卷积”与PyTorch实现

本文详细解析了DEA-Net中的'细节增强卷积'(DEConv)与PyTorch实现,通过多分支差分卷积和重参数化技术,显著提升单图像去雾效果。文章从数学原理到代码实现,手把手指导复现这一创新架构,帮助开发者在保持轻量化的同时实现41dB以上的PSNR指标,适用于自动驾驶、遥感监测等关键领域。

weixin_30323631的博客 505

[Java]数组循环位移

数组[n-1], 循环位移k位, 时间复杂度O(n) 方法A, 此算法的设计思路是什么呢? 1) 分为0 ~ k, k ~ n-1 两部分, 分别逆序 2) 0 ~ n-1 逆序 public class ArrayShift { static public void shift(Object[] ary, int k) { int n = ary.length; k

半岁的足迹 635

Ubuntu22.04中通过conda快速部署PyTorch开发环境(CPU/GPU双版本实战)

本文详细介绍了在Ubuntu22.04系统中,如何利用Conda高效部署PyTorch开发环境。文章分别提供了CPU与GPU双版本的实战教程,涵盖环境创建、镜像加速、版本匹配及深度验证等关键步骤,旨在帮助开发者快速搭建稳定、兼容的深度学习环境,从而专注于模型开发。

rose2的博客 557

vue2/3 - 【超详细】最新网站接入使用支付宝支付功能,点击支付跳转新页面后生成订单及支付二维码,实现支付宝在线付款详细的教程(整个支付的完整配置及支付流程,一键复制源码开箱即用)!

vue支付宝付款,vue支付宝支付,vue如何实现支付宝在线付款,vue网页pc项目接入支付宝支付,vue支付宝支付详细教程,vue2支付宝在线支付的详细示例代码,vue如何做支付宝付款,vue怎么实现支付宝的付款功能,vue调用支付宝进行付款支付,vue PC项目实现 支付宝支付,vue h5页面调用支付宝支付,vue页面唤起支付宝支付功能,vue支付宝支付跳转到新页面,vue如何跳转新开一页展示支付宝二维码支付,vue怎么新开页面进行支付宝在线支付,vue新页面支付宝支付功能,前端vue支付宝支付教程,

✅ 精选推荐文章 5730

java数组循环位移

public class MainTest{ public static void main(String[] args) {    int[] n = {7,4,8,9,1,5};     for(int i=0;i      outNum(n);      System.out.println();      moveNum(n);     }   } private sta

dkw1025的专栏 1142

【系统架构设计师】预测试卷四:综合知识(75道选择题)

本文整理系统架构设计师考试高频考点,涵盖计算机系统基础、计算机网络、数据库、软件工程与UML四大模块,共28道典型题目。重点解析Cache局部性原理、RISC/CISC区别、TCP三次握手、B+树索引优势、CAP定理、螺旋模型特点等核心概念,并标注易错选项,帮助考生快速掌握解题思路。 关键词:系统架构、Cache、RISC、TCP、B+树、CAP定理、螺旋模型

数据知道的博客 546

数组循环位移 三种

#include using namespace std; /* void RightShift1(char *arr, int N, int k){ while(k--){ char t = arr[N-1]; for(int i = N-1; i > 0; i--) arr[i] = arr[i-1]; ar

我的专栏 868

ChatGPT充值,银行卡被拒绝,图文教程

ChatGPT充值,银行卡被拒绝

weixin_46713695的博客 2万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

用数组解决循环位移问题

编写函数实现value左右循环移位(即移出的位在另一端填入)。函数原型为int move(int value,int n);其中value为要循环移位的数,n为移位的位数,n的绝对值不大于16,整型为16位。如果n<0表示左移,n>0表示右移,n=0表示不移位。在主函数中输入数据并调用该函数输出结果。

seewhysimon的博客 573

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

编程之美9:数组循环位移

1: RightShift(int *arr, int N, int K) { K %= N; while (K--) { int t = arr[N - 1]; for (int i = N - 1; i &gt; 0; i--) { arr[i] = arr[i - 1]; } ...

ndzjx的专栏 228

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

数组循环位移K位

来自《编程珠玑》,将数组看成一个向量x=ab,那么循环右移后数组就变成ba。从向量的角度考虑 (a-1b-1)-1=ba /* 不用临时变量交换a[begin]和a[end]两内存单元的内容 */voidstringReverse(chara[],intbegin,intend){for(;begin<end;begin++,...

weixin_30532987的博客 169

【C语言初学】一维数组的循环位移

一维数组的循环位移

weixin_62916524的博客 1647

【java】一维数组循环位移方阵

输出: 左移:7 4 8 9 1 5 4 8 9 1 5 7 8 9 1 5 7 4 9 1 5 7 4 8 1 5 7 4 8 9 5 7 4 8 9 1 右移:5 7 4 8 9 1 1 5 7 4 8 9 9 1 5 7 4 8 8 9 1 5 7 4 4 8 9 1 5 7 7 4 8 9 1 5 ----------------------- 1 public class d...

weixin_34120274的博客 621

《编程之美》读书笔记:2.17“数组循环位移”

 2.17“数组循环位移”题目:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。 网友azuryy提出了自己的解题思路,http://hi.baidu.com/azuryy/blog/item/18957077f796b31db051b9c0.html 博客原文: 这个问题,我在面试中也问过,几乎所有的cand

904

c语言数组元素向后位移,如何将一个数组的元素循环左移?

该楼层疑似违规已被系统折叠隐藏此楼查看此楼#include#include#defineSIZE(a)(sizeof(a)/sizeof(a[0]))#defineHBIT(a)((a&0x00000080)!=0)#defineLBIT(a)((a&0x00000001)!=0)intTAB[]={0x10,0x71,0x12,0x1...

weixin_42190030的博客 167

数组 循环位移 或 循环移动 (左移 或 右移) K位

指定一个数组,比如整数或字符串, 长度为N, 将其循环右移K位.以下是我的解法: 只需要遍历一次数组即可. 空间复杂度是o(1), 时间复杂度是o(N).不同于其他的解法: 1) 不需要求GCD(N,K) 2)不需要遍历2遍数组(STL源码中的reverse算法)void Output(int *pBuffer, int nCount){ if(!pBuffer || !nCoun...

dianchuoyong3677的博客 554
上一篇: 最大公约数
下一篇: 数组分割
Fivesplus
博客等级 码龄12年 1粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值