编程珠玑--旋转算法

简介:

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

 

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

 

题目:将一个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/
版权声明:本文的版权归作者与博客园共有。欢迎转载阅读,转载时须注明本文的详细链接。 

 

参考文档:

编程珠玑(第二版)

目录
相关文章
|
2月前
|
机器学习/深度学习 人工智能 算法
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)
|
3月前
|
监控 API 计算机视觉
OpenCV这么简单为啥不学——1.6、图像旋转与翻转(rotate函数、imutils环境安装、imutils任意角度旋转)
OpenCV这么简单为啥不学——1.6、图像旋转与翻转(rotate函数、imutils环境安装、imutils任意角度旋转)
35 0
|
4月前
每日一题——旋转图像
每日一题——旋转图像
|
11月前
Leecode 836. 矩形重叠最简单易懂的一个思想
Leecode 836. 矩形重叠最简单易懂的一个思想
30 0
|
12月前
|
算法
斜方向三消查找算法的原理和实现
昨天的文章中我们讲了三消查找算法的原理和实现,在宝石方块中,除了水平和竖直的三消之外,斜方向上也可以三消,今天这篇就讲一下斜方向上三消的原理和实现
88 0
斜方向三消查找算法的原理和实现
|
12月前
|
机器学习/深度学习
图解LeetCode——48. 旋转图像
图解LeetCode——48. 旋转图像
4250 0
|
测试技术
每日一题——旋转函数
每日一题——旋转函数
65 0
每日一题——旋转函数
|
机器学习/深度学习 算法 JavaScript
数据结构与算法-1 :旋转图像
从本文开始,我将开启一个新的系列文章的编写数据结构与算法,在本系列文章中,我将对牛客、LeetCode等主流算法刷题平台的精彩题目进行讲解,实现语言包括Python(主)、Javascript、C、C++,同时我也会将相关算法与我们的实际开发项目结合,帮助大家更好的理解这略显枯燥的算法。
数据结构与算法-1 :旋转图像
|
算法 JavaScript
LeetCode 6. Z 字形变换 | 算法-从菜鸟开始
本文是《算法-从菜鸟开始》系列文章的第7篇,欢迎收藏、留言、点赞。 话不多说,让我们继续我们的算法之旅。
126 0