`
limitforest
  • 浏览: 10335 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

对换和循环移位是一回事

 
阅读更多

----本文只是个人一点拙见,高手请忽略此文。

今天在看《编程之美》,里面有道很经典的题目--数组循环移位。之所以说它经典,是因为它多次出现各大IT公司的笔试、面试题上,而且这道题还曾经入选计算机考研的算法题。相信很多人都知道解法了,而且不只一种解法。书上也给出了三种解法,分别用了移位、考虑周全的移位和对换。看了书中的解法,除了了解题目本身的解法外,突然恍然大悟,原来对换和循环移位就是一回事啊!为什么这么说呢?让我们来看个最经典的交换算法,以交换一位为例:

让我们来看个最经典的交换算法,以交换一位为例:

这算法相信学过编程的人都知道,简单得不能再简单了。它使用了一个变量做为临时变量,临时存储数据。如下图所示,箭头表示交换过程。

可是我们可以换一种角度来看,它的意思的是说,在一个有两个数的数组{a,b}中,a向右循环移位,a代替了b原来所在的位置,b则移到了a 的位置,从而变成了{b,a}。是吧,也就是说两个数的交换和两个数的循环移位一位等效。如此推理,交换一个长度为n的数组,就是对一个长度为n的数组循环移位n/2位。

知道了这个概念有什么用呢,这有助于理解插入算法。所谓插入算法的核心函数是在第i位插入一个数,并且让这个数组从这个位置开始右移。这个函数我们可以理解为数组在末位插入了这个数,然后这个数组从第i位开始到数组的末端进行循环右移一位,这样新插入的数因为右移就会移动第i个位置去。代码如下

很多人可能对shift方法记不住,记不清k从多少开始,或者到底是arrs[k]赋值给arrs[k+1]还是arrs[k+1]赋值给arrs[k]。既然交换和循环移位是一回事,那么我们可以以交换来理解。也就是说,他们的过程可以这样理解:数组的末位a[j]和a[j-1]交换,然后a[j-1]和a[j-2]交换,...,直到a[i+1]和a[i]交换。这样就把a[j]移到了a[i]原来的位置上。

如果把每一步写出来就是这样:

约去无效的代码:

用循环写的话就是上面的方法。因此,如果shift方法记不住的话,可以多想想交换,代码就能起想来了。

分享到:
评论

相关推荐

    全排列和对换PPT课件.pptx

    对换是改变排列的一种操作,包括相邻对换(交换两个相邻元素的位置)和其他对换(交换任意两个元素的位置)。相邻对换是最简单的对换形式。值得注意的是,任何一次对换都会改变排列的奇偶性,即如果原排列是奇排列,...

    一个素数,当她的数字位置对换以后仍为素数,这样的数称为绝对素数。

    一个素数,当她的数字位置对换以后仍为素数,这样的数称为绝对素数。

    输入10个整数,将其中最小的数与第一个数对换

    在C++中,一个完整的程序通常由多个函数组成,包括`main()`函数和其他辅助函数。这些函数共同协作来完成特定的任务。在本例中,程序主要由以下几个部分构成: - **主函数 `main()`**:程序的入口点。 - **输入函数 ...

    c sharp对换型加密小系统

    在IT领域,对换型加密(也称为替换加密)是一种古老但基础的密码学技术,它涉及到将明文中的字符替换为其他字符以达到加密的目的。C#是一种强大的编程语言,广泛应用于各种软件开发,包括安全性和加密系统的设计。本...

    易语言鼠标左右键对换

    "易语言鼠标左右键对换"是一个针对易语言编程环境的特定功能,它允许程序员编写代码来交换鼠标的左键和右键功能,这对于某些特殊应用场景或者适应不同用户习惯来说非常有用。下面将详细解释这个知识点。 易语言是一...

    对换一张表中的两列数据

    对换一张表中的两列数据是 SQL 中的一种常见操作,对于数据库管理员和开发者来说都是必备的技能。SQL Server 提供了多种方式来实现对换一张表中的两列数据,本文将详细介绍这些方法。 使用 sp_help 和 sp_helptext ...

    html5碰撞对换

    基于html5碰撞后进行物体的位置对换,做得相对简单,希望大家不要吐槽,就算是给一些和我一样的菜鸟们一些启示吧

    易语言鼠标左右键对换源码.7z

    此外,为了测试和调试代码,开发者可能会创建一个简单的用户界面,如一个带有“开始”和“停止”按钮的窗口,以便用户可以自由地开启和关闭鼠标左右键对换功能。在实际应用中,这种功能可能用于特殊场景,比如某些...

    利率互换与货币对换.pptx

    总的来说,利率互换和货币对换是金融工具箱中的重要组成部分,它们为企业和金融机构提供了一种有效管理财务风险、降低成本、获取资金的手段。随着全球金融市场的不断发展,互换交易的复杂性和重要性只会继续增加,...

    全排列生成算法(字典序、邻位对换、递增进位制数,递减进位制数)

    本话题主要探讨了四种不同的方法:字典序排列、邻位对换、递增进位制数和递减进位制数,并提供了C++语言的实现。 1. **字典序排列**: 字典序排列是指按照字母表顺序或数字大小顺序生成所有可能的排列。在数字...

    macbook pro air imac win10系统必备 把option和command对换

    mac装了windows后无论是虚拟机还是独立系统 alt和win键是反着的这个小插件就是解决了左边的win和alt对换了下 和任何软件没冲突 放心使用 个人一直在用分享给大家 陆续关注我 关于mac的键盘映射我还写了好几个小插件 ...

    vb几个实例代码三角形面积 判断奇偶 左右对换等等

    在VB(Visual Basic)编程语言中,学习和实践各种实例是提升编程技能的重要途径。这里我们探讨几个关键的实例:计算三角形面积、判断数字奇偶性以及实现字符串左右对换的功能。 首先,我们来看计算三角形面积的例子...

    大班语言教案:对换节.docx

    【大班语言教案:对换节】是一篇针对幼儿园大班设计的语言教育活动,旨在通过讲述故事《对换节》来让孩子们理解并感受到故事的幽默与风趣,同时激发他们对父母辛勤工作的认识和尊重。这篇教案的核心知识点主要包括...

    易语言源码易语言鼠标左右键对换源码.rar

    易语言源码易语言鼠标左右键对换源码.rar 易语言源码易语言鼠标左右键对换源码.rar 易语言源码易语言鼠标左右键对换源码.rar 易语言源码易语言鼠标左右键对换源码.rar 易语言源码易语言鼠标左右键对换源码.rar ...

    利用指针将最小数与第一个数调换,最大数与最后一个数对换(C语言练习例程)

    C语言编程练习,需要使用手机APP:C4droid打开

    [精选]利率互换与货币对换.pptx

    利率互换与货币对换知识点总结 利率互换是指双方按照商定条件,在约定的时间内,交换一系列现金流的合约。互换市场的起源可以追溯到20世纪70年代末,当时的货币交易商为了逃避英国的外汇管制而开发了货币互换。1981...

    Java循环结构习题.pdf

    总结来说,该习题集涵盖了 Java 编程的基本概念和技术,包括循环结构、素数和绝对素数、数字位置对换、平方和的计算等。通过对这些知识点的学习和掌握,可以提高学生的编程能力和解决问题的能力。

    一个拖拽网页元素实现移位和互换位置的JS插件;

    2、通过绑定一个Class类名,实现对这些元素的拖拽,并实现移位功能; 2、通过绑定一个Class类名,实现拖拽这些元素,并与这些元素实现互换位置的功能; 3、拖拽一个元素与另一个元素互换位置,有二种模式,一是简单...

    幼儿园大班语言教案:对换节.pdf

    幼儿园大班语言教案:对换节.pdf

Global site tag (gtag.js) - Google Analytics