编程之美-2.17-数组循环移位

1. 简述

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

2. 思路

    其实看到题目中只允许两个附加变量应该也能想到,就是两个变量倒来倒去就行了。如果熟悉希尔排序的话,这题不是问题,希尔排序里面需要分组进行插入法排序,这里就是分组进行移位而已。
    举例先说明下,假设10个元素,要移动3位,那么就是三组,第一组:A[0],A[3],A[6],A[9],第二组:A[1],A[4],A[7],第三组A[2],A[5],A[8],每组分别内部移位即可。
    不过有一个问题必须注意,假设移动k为,数组长度为N,当k<=N/2时,没问题,但是当k>N/2是就不对了,当K<=N/2时,每个组都至少有两个元素,每个元素都会移动一次,而且都是向着应该移动的方向,移动指定的位数,没有问题。但是当K>N/2时,有的组会没有元素,这样的组不会移动,导致错误出现了。解决方法很简单,写两个移位函数,一个左移一个右移,比如,N=10,K=7,要求左移,可以改为N=10,K=3。进行右移即可。

3. 代码    

#include <iostream>
using namespace std;

void left_shift_k(char *a, int n, int k);
void right_shift_k(char *a, int n, int k);

void left_shift_k(char *a, int n, int k) {
k = k % n;

if(k > n/2) {
right_shift_k(a, n, n-k);
return;
}
int i,j;
char tmp;
for(i=0; i<k; i++) {
tmp = a[i];
for(j=i; j+k<n; j+=k)
a[j] = a[j+k];
a[j] = tmp;
}
}
void right_shift_k(char *a, int n, int k) {
k = k % n;
if(k > n/2) {
left_shift_k(a, n, n-k);
return;
}
int i,j;
char tmp;
for(i=0; i<k; i++) {
for(j=i; j+k<n; j+=k)
;
tmp = a[j];
for(; j>i; j-=k)
a[j] = a[j-k];
a[i] = tmp;
}
}

void output(const char* a) {
for(int i=0; i<8; i++)
cout << a[i] << "";
cout << endl;
}

int main() {
char a[8] = {'a', 'b', 'c', 'd', '1', '2', '3', '4'};
cout << "数组:" << endl;
output(a);
for(int i=1; i<=8; i++) {
char b[8] = {'a', 'b', 'c', 'd', '1', '2', '3', '4'};
cout << "右移" << i << "位:\t";
right_shift_k(b, 8, i);
output(b);
}
cout << endl;
for(int i=1; i<=8; i++) {
char b[8] = {'a', 'b', 'c', 'd', '1', '2', '3', '4'};
cout << "左移" << i << "位:\t";
left_shift_k(b, 8, i);
output(b);
}
system("PAUSE");
return 0;
}

    输出结果为:
   

4. 参考

    编程之美,2.17节,数组循环移位

转载于:https://www.cnblogs.com/pangxiaodong/archive/2011/10/08/2201766.html

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

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

相关文章

[html] 如何给页面添加追加右键菜单(原右键菜单功能保持不变)

[html] 如何给页面添加追加右键菜单&#xff08;原右键菜单功能保持不变&#xff09; 监听oncontextmenu&#xff0c;在系统右键菜单下追加自定义菜单个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 …

python写入excel特定区域_Python读取Excel中符合特定条件的数据,并写入新的表格中...

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接和本声明。 原始表格 代码#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2019/3/20 21:24 # Author : cunyu # Site : cunyu1943.github.io # File …

swoole 协程channel乱测

channel和数组差不多&#xff0c;可以被用作队列&#xff0c;属性capacity是设置容量&#xff0c;isEmpty() isFull() 用来判断队列是空还是满&#xff0c;push()加入队列 pop()弹出队列 interface pusher {function push($data); } #require redisconn.php; class mypusher im…

Rails 3:提高Ajax应用速度

Rails 3&#xff1a;提高Ajax应用速度 http://developer.51cto.com 2011-05-18 09:45 Stefan Siebel 51CTO 我要评论(0)我建立了一个列表网站&#xff0c;ListKungFo&#xff0c;其中大量使用了Ajax&#xff0c;目前为止网站运行非常良好。而过去两周里&#xff0c;我一直在…

[html] websocket和socket有什么区别?

[html] websocket和socket有什么区别&#xff1f; 1.Socket 是传输控制层的接口。用户可以通过 Socket 来操作底层 TCP/IP 协议族通信。 2.WebSocket 是一个完整应用层协议。 3.Socket 更灵活&#xff0c;WebSocket 更易用。 4.两者都能做即时通讯个人简介 我是歌谣&#xff…

opencv支持python3吗_Python3.4+opencv3

1、安装Python 3.4 for Windows 好的这好像没有什么可以说的 2、下载OpenCV 3和Numpy(OpenCV依赖Numpy库) 大家在这里就出了问题。如果使用直接使用pip install pyopencv安装一定会出错。这里使用了Python界活雷锋封装的安装包&#xff0c;大家根据自己的系统下载&#xff1a; …

Python之浅谈运算符

目录 格式化输出的三种方式基本运算符流程控制格式化输出的三种方式 运算符的语义取决于其操作数的类型 第一种格式化方式&#xff08;3.0&#xff09; name Tim height 170 weight 120 print(My name is:%s,my height is:%s,my weight is:%s%{name,height,weight})第二种格…

[html] websocket和http有什么区别?

[html] websocket和http有什么区别&#xff1f; WebSocket是双向的&#xff0c;在客户端-服务器通信的场景中使用的全双工协议&#xff0c;与HTTP不同&#xff0c;它以ws://或wss://开头。 HTTP是单向的&#xff0c;客户端发送请求&#xff0c;服务器发送响应。个人简介 我是…

Socketpair 简介

socketpair - a slight generalization of pipes used for two-way stream communication. 以下内容来自&#xff1a;匠意雕码 http://my.oschina.net/zengsai/blog/12583 今天用了一个从没玩过的socket函数socketpair()&#xff0c;它的作用是在进程内创建一对sock连接。乍一看…

cacti安装配置详解_MySQL实战001:8.0免安装版服务配置详解

首先我们需要先下载MySQL的安装包&#xff0c;MYSQL官方下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/&#xff0c;这里我下载的是MySQL Community Server 8.0.15版本&#xff0c;以前MySQL还有安装版&#xff0c;现在都是压缩版&#xff0c;解压之后将环境配置…

HttpServletRequest简述

HttpServletRequest简述 HttpServletRequest httpServletRequest (HttpServletRequest) request;/*getRequestURL方法返回客户端发出请求时的完整URL。getRequestURI方法返回请求行中的资源名部分。getQueryString 方法返回请求行中的参数部分。getRemoteAddr方法返回发出请求…

[html] 图片上传时实现本地预览功能的原理是什么?

[html] 图片上传时实现本地预览功能的原理是什么&#xff1f; 通过HTML5 File API读取用户上传的图片&#xff0c;生成一个image对象显示到页面个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录…

推荐两个检索和分类小工具Carrot2 OSS

Carrot2 Carrot2是一个开源搜索结果分类引擎。它能够自动把搜索结果组织成一些专题分类。Carrot2提供的一个架构能够从各种搜索引擎&#xff08;YahooAPI、GoogleAPI、MSN Search API、eTools Meta Search、Alexa Web Search、PubMed、OpenSearch、Lucene index、SOLR&#xff…

Eclipse最常用快捷键

Alt← 前一个编辑的页面 Alt→ 下一个编辑的页面 AltEnter 显示当前选择文件的属性 CtrlF11运行Run As CtrlM 当前窗口最大化 CtrlF7 视窗口切换 CtrlF8 模式切换 CtrlQ 定位到最后编辑的地方 CtrlL 定位在具体某行 CtrlK 选中的Word快速定位到下一个 ctrl.及ctrl1 当某行出错时…

[html] input如何在各个浏览器下保持UI统一?

[html] input如何在各个浏览器下保持UI统一&#xff1f; .ibutton { padding: 3px 15px; *padding: 0 15px; *height: 24px; font-size: 12px; text-align: center; text-shadow: #CF510B 0 1px 0; border:1px solid #ec5c0d; border-radius: 2px; background: #FC750A; backg…

11.27 如何选择具有某一角色的当事人?

/// <summary> ///根据当事人挡任的角色名称、当事人名称、名称拼音、身份证号模糊查询当事人 /// </summary> /// <param name"RoleName">角色名称</param> /// <param name"Name">当事人名称</param> /// <param…

python整数序列求和_Python从菜鸟到高手(14):序列的加法和乘法

1 序列的加法 序列也可以相加&#xff0c;但要注意&#xff0c;这里的相加&#xff0c;并不是相对应的序列元素值相加&#xff0c;而是序列首尾相接。由于字符串属于字符序列&#xff0c;所以字符串相加也可以看做是序列相加。但一个字符串不能和一个序列相加&#xff0c;否则会…

mysql xtrabackup 遭遇严重bug

我们的mysql 备份系统遭遇严重bug源于 开源软件 xtrabackup 的一个bug https://bugs.launchpad.net/percona-xtrabackup/bug/722638之前我们的大规模部署都没有遇到这问题。在做计数器转mysql 后&#xff0c;我们部署了备份系统&#xff0c;屡屡备份失败&#xff0c;于是决定彻…

[html] 能否做到禁止打印页面?如果可以那要怎么做?

[html] 能否做到禁止打印页面&#xff1f;如果可以那要怎么做&#xff1f; document.onbeforeprint function(){ return false; };个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一…

laydate时间控件有时候无效_新角度,如何无效没用地听课

嗨喽&#xff0c;大家好。这一期我想向大家展示一下如何无效地听课。1.上课的时候&#xff0c;全程集中注意力&#xff0c;每一秒都不能放松&#xff0c;使自己的大脑保持高度紧张中。我们这么年轻&#xff0c;精神充沛得很&#xff0c;只要累不死就往死里学。 2.下课的时候也不…