(转)数组循环右移

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

不合题意的解法如下:

我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次。abcd1234→4abcd123→34abcd12→234abcd1→1234abcd。伪代码如下:

代码清单2-33

 

 

RightShift(int* arr, int N, int K)

{

    while(K--)

    {

        int t = arr[N - 1];

        for(int i = N - 1; i > 0; i --)

            arr[i] = arr[i - 1];

        arr[0] = t;

    }

}

虽然这个算法可以实现数组的循环右移,但是算法复杂度为O(K * N),不符合题目的要求,需要继续往下探索。

 

分析与解法

假如数组为abcd1234,循环右移4位的话,我们希望到达的状态是1234abcd。不妨设K是一个非负的整数,当K为负整数的时候,右移K位,相当于左移(-K)位。左移和右移在本质上是一样的。

【解法一】

大家开始可能会有这样的潜在假设,K<N。事实上,很多时候也的确是这样的。但严格地说,我们不能用这样的“惯性思维”来思考问题。尤其在编程的时候,全面地考虑问题是很重要的,K可能是一个远大于N的整数,在这个时候,上面的解法是需要改进的。

仔细观察循环右移的特点,不难发现:每个元素右移N位后都会回到自己的位置上。因此,如果K > N,右移K-N之后的数组序列跟右移K位的结果是一样的。进而可得出一条通用的规律:右移K位之后的情形,跟右移K’= K % N位之后的情形一样。

代码清单2-34

RightShift(int* arr, int N, int K)

{

    K %= N;

    while(K--)

    {

        int t = arr[N - 1];

        for(int i = N - 1; i > 0; i --)

            arr[i] = arr[i - 1];

        arr[0] = t;

    }

}

可见,增加考虑循环右移的特点之后,算法复杂度降为O(N),这跟K无关,与题目的要求又接近了一步。但时间复杂度还不够低,接下来让我们继续挖掘循环右移前后,数组之间的关联。

【解法二】

假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位。比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把这两段看成两个整体。右移K位的过程就是把数组的两部分交换一下。变换的过程通过以下步骤完成:

1.   逆序排列abcd:abcd1234 → dcba1234;

2.   逆序排列1234:dcba1234 → dcba4321;

3.   全部逆序:dcba4321 → 1234abcd。

伪代码可以参考如下:

代码清单2-35

Reverse(int* arr, int b, int e)

{

    for(; b < e; b++, e--)

    {

        int temp = arr[e];

        arr[e] = arr[b];

        arr[b] = temp;

    }

}

RightShift(int* arr, int N, int k)

{

    K %= N;

    Reverse(arr, 0, N – K - 1);

    Reverse(arr, N - K, N - 1);

    Reverse(arr, 0, N - 1);

}

这样,我们就可以在线性时间内实现右移操作了。

转载于:https://www.cnblogs.com/boluo007/p/5470242.html

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

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

相关文章

Redis命令–使用Redis命令行

本文是我们学院课程的一部分&#xff0c;标题为Redis NoSQL键值存储 。 这是Redis的速成班。 您将学习如何安装Redis并启动服务器。 此外&#xff0c;您将在Redis命令行中乱七八糟。 接下来是更高级的主题&#xff0c;例如复制&#xff0c;分片和集群&#xff0c;同时还介绍了…

前端面试官常问javaScript编程题,隔壁王大爷看了都会了

目录 1.数组排序。 2.数组元素的去重&#xff1b; 3.用递归的方法求数组的求和&#xff1b; 4.防抖节流的思路。 5.深拷贝、浅拷贝&#xff1b; 6.做一个10秒的倒计时&#xff1b; 7.setTimeout()和setInterval()的使用以及区别 导读&#xff1a;一些常见的前端面试官会让…

(五)Struts2 标签

所有的学习我们必须先搭建好Struts2的环境&#xff08;1、导入对应的jar包&#xff0c;2、web.xml&#xff0c;3、struts.xml&#xff09; 第一节&#xff1a;Struts2 标签简介 Struts2 自己封装了一套标签&#xff0c;比JSTL 强大&#xff0c;而且与Struts2 中的其他功能无缝结…

HarmonyOS常见问题解答

学习资源主要分享 一、解答学习者的担心:手机/生态设备数量 、应用数量

thinkphp3.2自定义success及error跳转页面

thinkphp3.2自定义success及error跳转页面 默认的thinkphp success及error的默认模板不是很好看&#xff0c;下面分享如何自定义success及error页面&#xff0c;这里用的是thinkphp 3.2.2版本 默认的thinkphp success及error的默认模板不是很好看&#xff0c;下面分享大家如何自…

推荐几十本投资书籍、互联网书籍及热门查看流量的工具

工欲善其事必先利其器,今天孙叫兽给大家分享一下互联网运营的书籍、投资的书籍及一些查看抖音、微信公众号等后台数据的工具,个人感觉还是很实用的,内容有点多,不知道的可以根据图中的文字进行搜索。 互联网运行推荐阅书籍 投资理财的书籍 这里仅仅提供书籍的名称,根据书名…

Java Swing模型视图适配器介体

通常&#xff0c;我基于Spring Framework构建Java应用程序。 但是&#xff0c;最近有人要求我使用与语言无关的MVC框架PureMVC为客户端实现Java桌面应用程序&#xff0c;因此以下是我在Java Swing中为PureMVC进行员工管理展示的演示实现。 如果您想继续&#xff0c;可以在GitHu…

jquery.cookie.js操作cookie实现“记住密码”

//初始化页面时验证是否记住了密码 $(document).ready(function() {if ($.cookie("rmbUser") "true") {$("#rmbUser").attr("checked", true);$("#user").val($.cookie("userName"));$("#pass").val($…

程序员跳槽指南

找工作是件非常重要的事情,它直接影响你1~2年,间接影响你3~5年的人生。⼀个潜在的机会会让你少奋斗很多年,而一次冲动的离职,会让你和千万财富错失交臂。 忘掉那些随地乱扔的小广告,还有从几十个样本做出来的所谓调查报告,换工作不是⼀场说走就走的旅行,而是⼀个深思熟虑…

NSDictionary NSArray 转中文输出

// // NSDictionaryDescribetionDictionary.m // fengzi // // Created by 谢泽锋 on 16/5/10. // Copyright © 2016年 xiezefeng. All rights reserved. //#import <Foundation/Foundation.h> //数据字典数字打印中文显示implementation NSDictionary (Describ…

vue学习经验分享,在这个大前端时代,你再不会vue就out啦

主要为大家大致的介绍Vue的介绍、环境搭建要求、如何开发等经验分享 目录 vue介绍 Vue的MVVM模式介绍 Vue之HelloWorld Vue的生命周期 从Vue到页面

netbeans 源文件_具有NetBeans,WebLogic 12c,JPA和MySQL数据源的Arquillian

netbeans 源文件您可能已关注我的文章&#xff0c;该文章介绍了如何使用嵌入式GlassFish测试更复杂的场景&#xff08; 第I部分/第II部分 &#xff09;。 在我要做的事情上&#xff0c;下一步是使此设置与最新的WebLogic 12c一起使用。 入门 按照我的前两个帖子的入门部分中的…

程序员外包避坑指南?

为什么我不建议你去外包? 外包的分类 外包公司一般有两类,一类是驻场外包,一类是非驻场外包。二者的区别为是否需要被外派到甲方公司上班。如果需要,那么就属于驻场外包,否则就是非驻场外包。 虽然都是外包,但是两者的区别还是挺大的。 先说说驻场外包。由于需要被外派到…

数据库设计三大范式

数据库设计三大范式 为了建立冗余较小、结构合理的数据库&#xff0c;设计数据库时必须遵循一定的规则。在关系型数据库中这种规则就称为范式。范式是符合某一种设计要求的总结。要想设计一个结构合理的关系型数据库&#xff0c;必须满足一定的范式。 在实际开发中最为常见的设…

在各个PC端应用使用表情的快捷键,王大妈都开始用这个表情啦

很多人像在文章或者聊天使用表情&#xff0c;但是不知道如何输入&#xff0c;下面孙叫兽就来带你体验一下吧 快捷键 win. 比如在微信聊天框使用win. 就可以输入表情符号&#xff0c;颜文字及符号。 你们学废了&#xff1f;

扩展Java EE应用程序的基础

老实说&#xff0c;“可扩展性”是一个详尽的主题&#xff0c;并且通常没有被很好地理解。 通常&#xff0c;它被假定与高可用性相同。 我已经看到新手程序员和“经验丰富”的建筑师都建议将“ 集群 ”作为可伸缩性和HA的解决方案。 它实际上没有任何问题&#xff0c;但是问题在…

Mac MySQLdb模块安装,可算解决了

转载&#xff1a;http://blog.csdn.net/janronehoo/article/details/25207825 叨叨 短评&#xff1a;这篇文章感觉是比较全面解决Mac MySQLdb模块安装问题的文章了&#xff0c;特别转载一下 安装过程主要是mysql_config not found错误&#xff0c;这个错误通常卡住很多初学者&a…

史上最全wireshark使用教程,8万字整理总结,建议先收藏再耐心研读

目录 第 1 章 介绍... 1 1.1. 什么是Wireshark. 1 1.1.1. 主要应用... 1

小白自学前端,轻松月入过万哦!

第一、 前端的入门操作 首先是要熟悉前端的基础操作。 前端的基础&#xff1a;JavaScript&#xff0c;HTML&#xff0c;CSS&#xff0c;然后可以深入学习jQuery。 如果你是想 1.专攻网页&#xff0c;那你就学习HTML。 2.专攻层叠样式表&#xff0c;就学习CSS&#xff0c;它可以…

解决hibernate中的懒加载(延迟加载)问题

解决hibernate中的懒加载(延迟加载)问题 我们在开发的时候经常会遇到延迟加载问题&#xff0c;在实体映射时&#xff0c;多对一和多对多中&#xff0c;多的一样的属性默认是lazy"true"(即&#xff0c;默认是延迟加载)&#xff0c; 如&#xff1a;<many-to-one nam…