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

编程珠玑--旋转算法

旋转算法出自《编程珠玑》第二章题目。

 

《编程珠玑》一书对算法是极度推崇,这点意识在我们看书的时候每每都有被灌输。使用一种好的算法往往能使得程序更加漂亮,也很能带给我们程序员某种满足感。

 

题目:将一个n元一维数组a[n]左移i个位置。例如,当n=8,i=3时,数组abcdefgh旋转为defghabc。请设计一个算法完成这个任务。

 

1. 块交换法

分析:将n元一维数组a[n]分解为两块,将第一块存储在临时数组中,将第二块前移i个单位,再将临时数组加入到第二块后面。

 

如:n=8,i=3时,将第一块abc存储为临时变量,第二块defgh前移3个单位,再将abc放入到defgh后面。

 

思考:这种方法最大的缺陷至少需要与两块中较小的一块大小的临时变量。

 

2.杂技算法

分析:将a[0]存储在一个临时变量中,然后将a[i]替换a[0],a[2i]替换a[i]….当一个循环结束的时候,若替换次数小于n,则从a[1]开始替换…,需要经过gcd(n,i)(n和i的最大公约数)次循环后,才能把每一个元素都移到该移的地方。

求逆算法

 

下面是代码实现:

复制代码
 
   
#include < iostream >

using namespace std;

// 求最大公约数
// 辗转相除法
int gcd( int a, int b)
{
while ( a != 0 )
{
if (a >= b) a -= b;
else
{
int t = a;
a
= b;
b
= t;
}
}
return b;
}

// 杂技算法
void Rotate1( char * a, int lenth, int rotateLen)
{
int gcdNum = gcd(lenth,rotateLen);
for ( int i = 0 ; i < gcdNum; i ++ )
{
int temp = a[i];
int first = i;
while ( 1 )
{
int second = (first + rotateLen) % lenth;
if (second == i) break ;
a[first]
= a[second];
first
= second;
}
a[first]
= temp;
}
}


int main()
{
char a[ 9 ] = " abcdefgh " ;
Rotate1(a,
8 , 3 );
}

复制代码

 

 

 

 

3. 求逆算法

分析:将a[n]看做是向量BC组成,最终的结果需要时CB,过程如下:将BC各分别取逆B^-1C^-1,再对整个式子取逆,得到CB。

 

举例:将abcdefgh中的abc看做向量B,defgh看做向量C。

 

下面是代码实现:

复制代码
 
   
#include < iostream >

using namespace std;

void Revert( char * str, int start, int end)
{
while (start < end)
{
char temp = str[start];
str[start]
= str[end];
str[end]
= temp;
start
++ ;
end
-- ;
}
}

void Rotate1( char * a, int start, int end)
{
Revert(a,
0 , 2 );
Revert(a,
3 , 7 );
Revert(a,
0 , 7 );
}


int main()
{
char a[ 9 ] = " abcdefgh " ;
Rotate1(a,
0 , 7 );
}

复制代码

 

 

思考题:写一个算法实现字符串反转,将abc.sina.com反转为com.sina.abc。

 

分析:使用求逆算法,将abc,sina,com作为子串进行反转,再将整个字符串进行反转

 

作者:Nick Ye(yjf512)
出处:(http://www.cnblogs.com/yjf512/)
版权声明:本文的版权归作者与博客园共有。欢迎转载阅读,转载时须注明本文的详细链接。 

 

参考文档:

编程珠玑(第二版)

相关文章:

  • 基本排序算法二
  • HDU - 1455 Sticks(深搜+剪枝)
  • perl 递归两例
  • Tomcat学习总结(3)——Tomcat优化详细教程
  • memchached你知道和不知道的事
  • PHP教程,Linux教程光盘
  • C++走向远洋——51(数组类运算的实现)
  • C++模板的特化详解(函数模版特殊,类模版特化)
  • java读取文件中的内容写入excel中
  • 怎样解决asp.net.mvc上传附件超过长度问题?
  • 开发中的[绝对路径]与[相对路径]
  • Eclipse debug时 鼠标移动到变量时 自动显示变量只
  • SVM-非线性支持向量机及SMO算法
  • Spark版本定制第10天:流数据生命周期和思考
  • 《构建之法》观后感
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • ESLint简单操作
  • HTML中设置input等文本框为不可操作
  • input实现文字超出省略号功能
  • JavaScript HTML DOM
  • Laravel5.4 Queues队列学习
  • Python3爬取英雄联盟英雄皮肤大图
  • python大佬养成计划----difflib模块
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • vue的全局变量和全局拦截请求器
  • Yeoman_Bower_Grunt
  • 闭包--闭包作用之保存(一)
  • 从0实现一个tiny react(三)生命周期
  • 从零开始的无人驾驶 1
  • 等保2.0 | 几维安全发布等保检测、等保加固专版 加速企业等保合规
  • 多线程事务回滚
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 构建二叉树进行数值数组的去重及优化
  • 聚类分析——Kmeans
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 全栈开发——Linux
  • 如何解决微信端直接跳WAP端
  • 深入浅出webpack学习(1)--核心概念
  • 手写一个CommonJS打包工具(一)
  • 一个完整Java Web项目背后的密码
  • 走向全栈之MongoDB的使用
  • elasticsearch-head插件安装
  • 整理一些计算机基础知识!
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • $.ajax()参数及用法
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (js)循环条件满足时终止循环
  • (笔试题)合法字符串
  • (二)【Jmeter】专栏实战项目靶场drupal部署
  • (翻译)terry crowley: 写给程序员
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决