引言

在自己刚刚毕业不久的时候,去了一家公司面试,面试官现场考了我这道题,我记忆深刻,当时没有想到思路,毫无疑问被面试官当成菜鸟了。

最近刚好在研究数组的各种算法实现,就想到这道题,可以拿来实现一下,纪念自己逝去的青春。

需求

假设有这样一个数组

[1,2,3,4,5]

现在想要左移或者右移N位,比如移动1位

//左移1位

[2,3,4,5,1]

//右移1位

[5,1,2,3,4]

算法实现

这样一道题目,你先不要看我下面的代码,自己思考一下如何实现它,不管是复杂的还是简单的方法。

可以先告诉你我用了2行代码实现左、右移动元素。

拆分法

当我们没有具体思路的时候,就先假设数组移动1位的情况。

[1,2,3,4,5]

=>

[null,1,2,3,4] and [5,null,null,null,null]

=>

[5,1,2,3,4]

这里可以看成2个数组,一个是没有到达边界的元素移动[null,1,2,3,4],一个是到达了边界的元素移动[5,null,null,null,null],当元素到达边界,就会往数组的初始位置移动,形成了一个循环的过程。

很明显,如果我们将这2个移动后的数组合并起来,就是需求的结果。

移动2位

同样符合2个移动后的数组合并起来为结果的情况

[1,2,3,4,5]

=>

[null,null,1,2,3] and [4,5,null,null,null]

=>

[4,5,1,2,3]

刚好移动数组长度

[1,2,3,4,5]

=>

[1,2,3,4,5] and [] //如果没有,就假设为空数组

合并数组

假设移动1位的情况

上面的步骤,我们找到了规律,接下来要做的是找到2个数组,需要用到slice截取数组元素。

截取第一个数组

arr.slice(0,-1)

// [1,2,3,4]

截取第二个数组

arr.slice(-1)

// [5]

合并数组

arr.slice(-1).concat(arr.slice(0,-1))

// [5,1,2,3,4]

这样你就实现了移动1位的情况,接着,你继续拿+5和-5范围内的数字进行测试,发现都可以正常移动,当数字大于5或者小于-5的时候,代码就无效了,始终输出[1,2,3,4,5]

arr.slice(-6).concat(arr.slice(0,-6))

// [1,2,3,4,5]

我们再加上一个小技巧,求余数,假设是移动6,那么,实际上和移动1是相同的,我们就可以根据公式求余数

n = n%arr.length

// n = 6%5 余1

同理,当移动-6时

n = n%arr.length

// n = -6%5 余-1

接着带入公式,发现输出全部都正确了!!

思路分析完了,应该很清晰了吧,源码在下面、

算法源码

arr表示原始数组,n表示移动的距离,可以是正数、可以是0、也可以是负数、正数表示右移,负数表示左移,0表示不移动。

function moveElement(arr, n) {

if(Math.abs(n)>arr.length) n = n%arr.length

return arr.slice(-n).concat(arr.slice(0,-n))

}

// moveElement(arr, 9)

// moveElement(arr, 0)

// moveElement(arr, -9)

总结

下次面试要是继续碰到这道题,可能我又当场忘记思路了?

补充

看到有评论讨论不同方案的实现,这些都很厉害,没有唯一的答案,而思考解决方案的时候,要考虑的是时间复杂度,移动数组的元素都会造成数组的重新排列。

第一步方案我觉得应该是找到最小移动位置的代价,即移动2和移动2n是一样的,我们就只需要移动2,不需要再移动n,求余数的作用在于此,根据移动的位置切分出2个数组,不需要移动元素,最后我用的是concat合并2个数组,返回一个新的数组副本,这样就避免了移动元素。

还有一种方案是将2个数组使用new Set(array1)和new Set(array2)设置为集合,集合是key、value的散列表,可以用最少的代价移动位置,不导致重排,用集合移动完之后,再Array.from()转换回数组。

切忌,不要尝试去直接修改原数组的元素位置,这样做代价非常大,尤其是数组长度很长的时候!!

python列表元素循环左移_JavaScript系列——数组元素左右移动N位算法实现相关推荐

  1. 数组元素循环左移n个位置(JAVA)

    问题描述: 将n(n>1)个整数存放在一维数组R中,设计一个在时间和空间两方面都尽可能高效的算法. 将R中保存的序列循环左移p(0<p<n)个位置,即将R中的数据(x0,x1,x2, ...

  2. 记录 jquery 循环删除多个数组元素

    记录 jquery 循环删除多个数组元素 var array = [ { id: 1, name: 'test1'}, { id: 2, name: 'test2'}, { id: 3, name: ...

  3. 详细讲解用Python列表for循环还有if判断语句写出1-100之内的素数,思路清晰语法准确代码简单易懂实用

    详细讲解用Python列表for循环还有if判断语句写出1-100之内的素数,思路清晰语法准确代码简单易懂实用,当然还有一定技巧的算法渗透其中.请看视频: Python 代码实例,找出1-100之内的 ...

  4. python列表元素循环左移_python字符串循环左移

    本文实例为大家分享了python字符串循环左移的具体代码,供大家参考,具体内容如下 字符串循环左移 给定一个字符串S[0-N-1],要求把S的前k个字符移动到S的尾部,如把字符串"abcde ...

  5. 列表输出循环左移_互联网人工智能开发语言Python之for循环、break、continue详解...

    IT技术研习社,专注互联网技术研究与分享,喜欢的朋友可以点击[关注]:把经验传递给有梦想的人: 1.for循环 Python循环的话除了while还可以用for完成循环. 在Python中for循环可 ...

  6. python list每个重复元素保留一次,python 列表(list)去除重复的元素总结

    方法一: 将list作为set的构造函数构造一个set,然后再将set转换会list就可以 >>> myList = [1, 2, 3, 3, 2, 2, 4, 5, 5] > ...

  7. 列表输出循环左移_python 列表推导式(经典代码)(21)

    文章首发微信公众号,微信搜索:猿说python 截止到目前为止,python基础内容已经学习了50%左右,在学习编程过程中,我们不仅要学习python语法,同时也需要学习如何把自己代码写的更美观,效率 ...

  8. python求数字平均值_Python简单计算数组元素平均值的方法示例

    本文实例讲述了Python简单计算数组元素平均值的方法.分享给大家供大家参考,具体如下: Python 环境:Python 2.7.12 x64 IDE : Wing IDE Professional ...

  9. C语言for循环实现遍历指针数组元素

    #include <stdio.h> int main() {//1.注意(每个数组名)都是这个数组首个元素的指针,下方[5]表示有5个元素,首个元素的指针就是5个元素中的首个元素的指针i ...

最新文章

  1. AI人工智能天机芯芯片
  2. 高级数据结构讲解与案例分析
  3. 经典算法题每日演练——第六题 协同推荐SlopeOne 算法
  4. 四则运算 3.0 结对
  5. 【ES6】Module模块详解
  6. java 把char转换成int型,java如何把char型数据转换成int型数据(转)
  7. 2021 CCF颁奖典礼隆重举行
  8. 人工智能:第七章 机器学习
  9. WordPress 高颜值自适应黑/白模式Puock主题
  10. 与或非运算(布尔值/非布尔值)
  11. Linux基本命令之grep命令常见用法
  12. 中冠百年|到了30岁应该如何增加收入?
  13. 查看虚拟机ip地址的方法
  14. 【渝粤教育】电大中专新媒体营销实务 (2)_1作业 题库
  15. 扛住100亿次请求——如何做一个“有把握”的春晚红包系统”
  16. AI上推荐 之 隐语义模型(LFM)和矩阵分解(MF)
  17. ORID方法在敏捷中的利用
  18. 汉堡式折叠html,纯CSS3菜单汉堡包按钮变形动画特效
  19. cve查询_CVE年满21岁:如何实现这一里程碑
  20. 本地mysql拒绝jdbc连接失败_jdbc连接MySQL数据库的诡异异常 java.net.ConnectException: 拒绝连接...

热门文章

  1. jquery 下拉选择框/复选框常用操作
  2. java c 性能分析工具_Jprofiler使用介绍--java性能分析工具中文帮助
  3. CountDownLatch1.8源码
  4. 数据库——Oracle(1)
  5. 应用程序级别之外使用注册为 allowDefinition='MachineToApplication' 的节是错误的(转载)...
  6. python--关于if __name__==__main__的解释
  7. PHP中的Array类型其实是Hashtable
  8. cygwin的安装使用
  9. 表视图(UITableView)与表视图控制器(UITableViewController)
  10. 福布斯评最佳与最差老板 TCL上黑榜