leetcode explore 初级算法第三题,旋转数组代码实现。原题链接:

题目分析

因为题目不是很长,这里把题目贴出来:

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

示例 1:

输入: [1,2,3,4,5,6,7] 和 k = 3

输出: [5,6,7,1,2,3,4]

解释:

向右旋转 1 步: [7,1,2,3,4,5,6]

向右旋转 2 步: [6,7,1,2,3,4,5]

向右旋转 3 步: [5,6,7,1,2,3,4]

示例 2:

输入: [-1,-100,3,99] 和 k = 2

输出: [3,99,-1,-100]

解释:

向右旋转 1 步: [99,-1,-100,3]

向右旋转 2 步: [3,99,-1,-100]

说明:

尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。

要求使用空间复杂度为 O(1) 的 原地 算法。

题目意思很简单,就是将数组往后移动 k 个位置,超出数组长度的从头开始计算。如果只是这个要求,题目特别简单,新开一个数组,然后将原数组移动 k 保留到对应位置即可。而题目的难点在于需要“原地”移动,空间复杂度为 O(1),即不能新创建数组。

参考答案

首先分析题意,很容易想出移动位置公式:

target_pos = (pos + k) % nums_len

剩下的就是解决“原地”的问题,很容易想到一种思路,就是移动后,从移动后的位置再接着去移动,同时保留原来位置的数据。这样只需要一个临时变量去保存被替换的变量即可。但中间有一些坑,比如:有些数据移动 k 个会形成一个循环,比如 [-1,-100,3,99] 和 k = 2,-1 到 3, 3 又回到 -1,-1 又到 3。如何解决这些循环问题是关键。

我的参考代码如下:

'''

@Author: demon

@Date: 2019-10-28 11:16:44

@LastEditors: demon

@LastEditTime: 2019-10-28 18:37:12

@Description: https://leetcode-cn.com/explore/featured/card/top-interview-questions-easy/1/array/23/ 旋转数组

'''

class Solution(object):

def rotate(self, nums, k):

"""

:type nums: List[int]

:type k: int

:rtype: None Do not return anything, modify nums in-place instead.

"""

if not nums:

return

start_pos = 0

move_count = 0

nlen = len(nums)

for i in range(0, nlen):

if move_count == nlen:

break

pos = i

move_num = nums[pos]

while True:

target_pos = (pos + k) % nlen

tmp = nums[target_pos]

nums[target_pos] = move_num

move_count += 1

if target_pos == i or move_count == nlen:

break

pos = target_pos

move_num = tmp

if __name__ == "__main__":

s = Solution()

nums = [1, 2, 3, 4, 5, 6, 7]

s.rotate(nums, k=3)

print(nums) # [5, 6, 7, 1, 2, 3, 4]

nums = [-1, -100, 3, 99]

s.rotate(nums, k=2)

print(nums) # [3, 99, -1, -100]

nums = [-1, -100, 3, 99]

s.rotate(nums, k=4)

print(nums) # [-1, -100, 3, 99]

nums = [-1]

s.rotate(nums, k=4)

print(nums) # [-1]

nums = [-1]

s.rotate(nums, k=0)

print(nums) # [-1]

nums = [1, 2, 3, 4, 5, 6]

s.rotate(nums, k=3)

print(nums) # [4, 5, 6, 1, 2, 3]

nums = [1, 2, 3, 4, 5, 6]

s.rotate(nums, k=2)

print(nums) # [5, 6, 1, 2, 3, 4]

上面给出了一些测试用例,基本上能覆盖一些比较坑的情况,如果你的代码能过这些用例,基本也就能 AC 了

leetcode旋转数组 c语言,leetcode explore 初级算法第三题,旋转数组代码实现相关推荐

  1. c语言 读入两个数组,c语言:读入两个学生的情况存入结构数组。

    c语言:读入两个学生的情况存入结构数组. 答案:4  信息版本:手机版 解决时间 2019-10-02 07:01 已解决 2019-10-01 20:38 读入两个学生的情况存入结构数组,每个学生的 ...

  2. 合并两个有序数组(初级算法合并两个有序数组)

    合并两个有序数组 1.题目: (合并两个有序数组) 2. 示例 3.解答步骤 4. 提交结果(提交用时和内存消耗) 声明: 题目均来自力扣,网址力扣官网, 如有侵权,告知必删! 本题地址: 点击我跳转 ...

  3. C语言实现扫雷完整算法详解~(附完整代码~)

    扫雷是一个常见小游戏,那么如何用C语言实现扫雷呢?学习了二维数组之后,我们可将扫雷的网格区域存储为二维数组,从而使用C语言实现扫雷. 目录 1.算法基本思路 2.算法详解 1.初始化数组与打印数组 2 ...

  4. map的key可以试一个数组吗?_【自考】数据结构第三章,数组,期末不挂科指南,第5篇...

     数组 概念如下 数组可以看成线性表的一种推广,其实就是一种线性表,一维数组又称为向量 数据由一组具有相同类型的数据元素组成,并存储在一组连续的存储单元中 若一维数组中的数据元素又是一维数组结构,则 ...

  5. leetcode跳跃游戏C语言,LeetCode:跳跃游戏

    给定一个非负整数数组,你最初位于数组的第一个位置. 数组中的每个元素代表你在该位置可以跳跃的最大长度. 判断你是否能够到达最后一个位置. 示例 1: 输入: [2,3,1,1,4] 输出: true ...

  6. leetcode算法第三题

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度.示例 1:输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc& ...

  7. char un 数组printf_c语言中能不能用printf函数直接输出数组?如printf(%d,a[3][3]);

    展开全部 限制在C语言中,利用printf直接输出数组是不可以的. 但是你32313133353236313431303231363533e58685e5aeb931333337616538的做法是可 ...

  8. 【c语言】蓝桥杯算法提高 三个整数的排序

    问题描述 输入三个数,比较其大小,并从大到小输出. 输入格式 一行三个整数. 输出格式 一行三个整数,从大到小排序. 样例输入 33 88 77 样例输出 88 77 33 #include<s ...

  9. leetcode探索专题中的初级算法练习题(python代码+解题思路)

    本文记录leetcode探索专题中的初级算法练习题,附python实现代码&解题思路,做题过程不免查阅网络资料,侵删~如有错误,欢迎指正交流! 目录 专题一:数组: 26.从排序数组中删除重复 ...

最新文章

  1. 侧记戴尔的第三代虚拟化价值观
  2. [WC2018]通道
  3. SpringMVC+Hibernate +MySql+ EasyUI实现POI导出Excel(二)
  4. Zookeeper常用命令操作,javaAPI操作之Curator框架 API
  5. CSS3里的display
  6. python将csv转字典_python – 将CSV数据转换为字典中的列表
  7. swagger连接mysql数据库_一键生成数据库文档,堪称数据库界的Swagger,有点厉害!...
  8. 复制 在div层加滚动条
  9. 算法:回溯九 Plus在数字字符串中加入加号,求所有情况的和
  10. 国考省考行测:言语理解与表达,主旨理解,结构分析法,总分结构
  11. 【IoT】产品外包策略:外包地图-充分利用内外部资源
  12. python求不规则图形面积_使用Python生成不规则形状的图形
  13. Unity3D-人物角色选择
  14. vue使用百度搜索接口实现下拉搜索效果
  15. 其中恐龙纪录片,你应该让你的孩子观看
  16. 赤子之心李宗吾·《厚黑学全书》
  17. 未能开启本地隧道服务器,IPV6隧道适配器始终未能打开,请大神帮忙看下
  18. 城墙(sandcas.pas/cpp)
  19. C语言实现数组的旋转
  20. Python是人工智能的未来。

热门文章

  1. JavaScript是如何同时做到单线程和异步执行的
  2. cpu与外设工作原理
  3. python获取一个模块的路径_如何获取 Python 模块的路径
  4. px word 表格宽度_word怎样批量修改表格的宽度(2)
  5. matlab中龙贝格积分,龙贝格积分-matlab通用程序
  6. 发布json数据_技术分享 | MySQL 8.0.17 GA 发布!
  7. oracle11g迁移到12cpdb,12c跨平台完成PDB的备份迁移
  8. nonlocal python3_Python3中 对local和nonlocal 关键字的认识
  9. Starry Night [USACO]
  10. CocoaPods 安装与使用教程