循环移位(翻转算法)

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

在编程珠玑学到了“翻掌算法”

就是我们试一下十元数组向上旋转5个位置的例子。

初始时掌心对着我们的脸,左手在右手上边,先将左手反转(掌心朝外,掌背朝我们的脸),再将右手翻转(同左手),最后两只手同时翻转,大家可以自己实验一下,挺有趣的。

下边放一下代码:

def ReversalList(list):
    l = 0;
    r = len(list) - 1;
    while(l < r):
        list[l], list[r] = list[r], list[l];
        l += 1;
        r -= 1;
    return list;

def LeftReverseList(list, n):
    LeftList = ReversalList(list[0 : n]);
    RightList = ReversalList(list[n : len(list)]);
    return ReversalList(LeftList + RightList);

def LeftReverseListTest(Max):
    count = 0;
    for i in range(0,Max):
        list = [];
        for j in range(0,i):
            list.append(random.randint(-int(Max / 2), int(Max / 2)));
        test = random.randint(0, i);
        NewList = LeftReverseList(list, test);
        print(test);
        print(list);
        print(NewList);
        if (list != LeftReverseList(NewList, i - test)):
            print(list);
            print(i, ':error\n');
        else:
            count += 1;
    if (count == Max):
        print('allright');
    return count;


if __name__ == '__main__':
    Max = 10;
    LeftReverseListTest(Max);

我们甚至可以对两端同时翻转,这样能大大提升速度。
基于OpenCV实现的图像行方向循环移位 基于OpenCV+VS2013实现的图像行方向循环移位,适用于3通道或单通道图像,移位起始点是0到高度之内的随机整数。若需列方向循环移位,可首先旋转原图。 立即下载

相关推荐

数组元素循环翻转(CyclicRotation)

An array A consisting of N integers is given. Rotation of the array means that each element is shifted right by one index, and the last element of the array is moved to the first place

liweli的博客 360

文科生都能看懂的循环移位算法

循环移位问题真的是一个特别经典的问题了,今天我们就来攻克它。循环移位的表现形式有很多种,就数据结构来说包括数组,字符串,链表等。就算法来说,有包含问题,直接移动问题,还有...

azl397985856的专栏 743

字符串反转,神奇的算法-读《编程珠玑(第二版)》

最近在缓慢地读《编程珠玑(第二版)》(英文名Programming Pearls),书很薄(正文才160多页),但正如其封面“近20年来众多大师级程序员一致推崇的作品”所示,这本经典哪能是我一下子就能读完的?书中有很多简洁但有趣的例子分析,更有作者的实际经验及注意点的阐述,值得一点点地读,一遍不够以后再来第二、三遍... 另外,前些天发现51CTO读书频道有《编程珠玑(续)...

weixin_33713707的博客 181

《编程珠玑2》读书笔记1---翻转代码

第二章 ”啊哈,算法“ P11 问题B:将一个n元一维向量向左旋转i个位置(循环移位),例如abcdefgh左循环移位3个位置变成defghabc  要求:使用一个n元的中间向量在n步内完成,能否仅适用数十个额外字节的存储空间,在正比于n的时间内完成? "啊哈,灵机一动": 贴个照片,不侵权吧,呵呵,手我加了指甲,分辨手掌正反面 代码: package org.

On the way 724

数组旋转问题的讨论

问题:将一个数组a中的元素向左旋转i个位置。这个问题看似比较简单。但是在许多的应用程序中以各种不同的伪装出现。并且该功能也是向量的一个基本操作。对于此问题,本文中将给出三种解决方法。方法一首先将a的前i个元素复制到一个临时数组中,然后将余下的n-i个元素向左移动i个位置,最后将最初的i个元素从临时数组中复制到a中的余下位置。void convert1(int a[], int n, int m) ...

代码穿越 888

(原创)单词翻转

1.循环移位例:abcd循环移位一次就是bcda循环移位两次就是cdab循环移位三次就是dabc结论:长度为n,循环移位m次其实就是,移位m%n次。编程思路:前m%n位翻转,后m-m%n位翻转。再总体翻转一次。举一反三:以上为循环左移动,如果是右移动呢?编程思路:前m-m%n位翻转,后m%n位翻转,再总体翻转一次。2.单词翻转例:I'm a student. 翻转之后结果:student. a I...

foreveyking的博客 450

数组的循环移位

功能描述:数组的循环移位, 输入:{a,b,c},2 输出:{b,c,a} package 华为机试题;/** * @author Hutongling * * @time:2017年4月8日 下午9:11:32 */ public class 数组的循环移位 { static char[] arrayMove(char[] data,int length){

hutongling的博客 589

[字符串] 一个巧妙的字符串循环移位

给定一个长度为m的串,将其循环移位,向右移动n位,输出循环移位后的字符串: 例: m=7,n=3; 移动前:”1234567” 移动后:”5671234”一个巧妙的办法: 将给定的串分割成两个串,长度分别为m-n和n,分别将其翻转翻转后将其连接成一个串,再次翻转,就得到了最终移动后的串!“1234567” “1234”,”567” “4321”,”765” “4321765” “

童凌的技术博客 5818

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

<br />面试的时候也碰见了这个问题,我当时采取的解决方案是把数组double,然后从length-k开始遍历length个字符。时间开销是O(2N) = O(N)<br />空间开销是O(2N) = O(N);<br />这个代码就不贴了,实现起来比较简单。<br /> <br />为了减少时间和空间的开销,我们还能有更好的解法么?<br />时间复杂度已经是线性了,这个开销已经不能再降低了,空间呢?<br /> <br />然后我考虑用大小为k的数组保存需要移位的数据,然后执行移位操作。考虑到当k>N

hitrose27的专栏 953

华为机试题---数组移位

一、问题描述 功能描述:数组的循环移位, 输入:{a,b,c},2 输出:{b,c,a}  要求实现方法: /**  *data :待循环数组  *index:移动位数  */ public String[] getChildren(String[] data,int index) {     //TODO     return null; } 二、算法分析

夜深人静后的码农 1333

行列循环移位C语言,C语言数组元素的循环移位方法

C语言数组元素的循环移位方法如下所示:/*C语言数组元素的循环移位*/#include int main(){int num[5],num1[5];int i, j,k=1;int t,n;printf("请输入5个数:");for(i=0;i<5;i++){scanf("%d",&num[i]); //将数读入数组num}printf("请输入循环次数:");scanf("%d",...

weixin_33494995的博客 748

编程之美2.17 数组循环移位

      这是一个非常经典的题目,题目的大概意思是这种:      有一个存储字符串的数组,须要依照要求循环移动数组中的字符。比如,数组中存储字符 abcd1234。循环右移4位。之后,会得到这样一个字符数组 1234abcd。当然,左移也是相同的解法      想想这个问题不是非常难,顺序依次移动就能够了。这样做的话,时间复杂度是O(n2)量级的。那么,有没有更快的方法呢?      首先...

weixin_34185512的博客 185

字符串

1. 字符串循环移位包含 s1 = AABCD, s2 = CDAA Return : true 给定两个字符串 s1 和 s2,要求判定 s2 是否能够被 s1 做循环移位得到的字符串包含。 s1 进行循环移位的结果是 s1s1 的子字符串,因此只要判断 s2 是否是 s1s1 的子字符串即可。 def isContainsByConcal(a, b): if not a or not b: return False new_a = a + a return b in new_a

PotoCoder 的博客 403

Leetcode 题解 - 字符串

1. 字符串循环移位包含 2. 字符串循环移位 3. 字符串中单词的翻转 4. 两个字符串包含的字符是否完全相同 5. 计算一组字符集合可以组成的回文字符串的最大长度 6. 字符串同构 7. 回文子字符串个数 8. 判断一个整数是否是回文数 9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数 1. 字符串循环移位包含 编程之美 3.1 s1 = AABCD, s2 = C...

weixin_37097995的博客 314

c语言 三步翻转法 实现数组循环左(右)移k位(二)

三步翻转法 其实也就是我们线性代数中的矩阵的反置。 具体介绍可以看这里:https://gaomf.cn/2016/11/28/Array_Shift/ 主要的思想如下: c语言代码实现: #include<stdio.h> //循环移动数组 //经典的三次反转实现数组循环左移K位 void swap(int *n,int *m) { int p; p = *n; *n ...

Yannie's Blog 1483

怪异的洗牌——STL

题目描述对于一副扑克牌,我们有多种不同的洗牌方式。一种方法是从中间某个位置分成两半,然后相交换,我们称之为移位(shift)。比如原来的次序是123456,从第4个位置交换,结果就是561234。这个方式其实就是数组的循环移位,为了多次进行这个操作,必须使用一种尽可能快的方法来编程实现。在本题目中,还引入另外一种洗牌方式,就是把前一半(如果总数是奇数,就是(n-1)/2)牌翻转过来,这种操作称之为...

qq_38030194的博客 704

1008. 数组元素循环右移问题 (20)

一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式:每个输入包含一个测试用例,第1行输入N ( 1=0);第2行输入N个整数

aaron的专栏 8277

算法学习之字符串系列小结

文章目录字符串58. 最后一个单词的长度387. 字符串中的第一个唯一字符242. 有效的字母异位词205. 同构字符串 字符串 58. 最后一个单词的长度 给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。 如果不存在最后一个单词,请返回 0 。 说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。 示例: 输入: "Hello World" 输出: 5 解题思路: 从右向左遍历,从第一个不是空

Suarge的博客 324

Leetcode题解——数据结构之字符串

1. 字符串循环移位包含 2. 字符串循环移位 3. 字符串中单词的翻转 4. 两个字符串包含的字符是否完全相同 5. 计算一组字符集合可以组成的回文字符串的最大长度 6. 字符串同构 7. 回文子字符串个数 8. 判断一个整数是否是回文数 9. 统计二进制字符串中连续 1 和连续 0 数量相同的子字符串个数 1. 字符串循环移位包含 编程之美 3.1 ...

dieshi8689的博客 379
上一篇: 二分搜索及测试函数
下一篇: Python实现一个二叉树类
yk_ee
博客等级 码龄10年 6粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值