Rotate Array

原题链接Rotate Array

回转一个给定数组k步,本质上是将后k个元素移动到前面(需要保证k小于数组元素个数)

不在原数组上操作的话比较简单,新开一个vector保存回转后的顺序,然后copy到原数组上,时间和空间复杂度都是O(n)

如果需要在原数组上操作的话,就不能有额外的空间使用消耗。那么有如下技巧

  1. 将数组后k个元素逆序
  2. 将数组前n - k个元素逆序
  3. 将整个数组逆序

依次执行上述步骤就完成了回转,以[1,2,3,4,5,6,7]为例,另k为3,那么

  1. 将后3个元素逆序,变为[1,2,3,4,7,6,5]
  2. 将前4个元素逆序,变为[4,3,2,1,7,6,5]
  3. 将整个数组逆序,变为[5,6,7,1,2,3,4]

解释

  • 对于数组的某个子部分,两次逆序等于没有改变,所以前n-k个元素和后k个元素这两部分的内部顺序不会被改变
  • 对于数组的整体而言,只逆序了一次,相当于改变头尾顺序

代码如下

class Solution {
public:void rotate(vector<int>& nums, int k) {if(nums.empty() || k <= 0)return;int n = nums.size();/* 防止k大于n,这一步骤让k小于n。因为回转n次等于没有回转 */k %= n;std::reverse(nums.begin() + n - k, nums.end());std::reverse(nums.begin(), nums.begin() + n - k);std::reverse(nums.begin(), nums.end());}
};

Rotate List

原题链接Rotate List

回转链表,将后k个非空节点移动到表头。
因为数组可以通过下标定位,所以可以进行三次逆序,但是链表不行,首先不知道链表中节点个数,其次不能够直接定位到倒数第k个非空节点。

问题分两步

  • 确定非空节点个数
  • 从头找第n - k个节点,将其作为最后一个节点,第n - k + 1个节点作为表头

代码如下

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode* rotateRight(ListNode* head, int k) {if(head == nullptr || k <= 0)return head;int n = 1;ListNode* tail = head;/* 确定非空节点个数以及最后一个非空节点 */while(tail->next){++n;tail = tail->next;}/* 另k小于n,如果k不为0,说明仍然需要回转 */if(k %= n){/* 最后一个节点指向表头tail->next = head;/* 找到第n-k个节点,因为head是第一个,所以i从1开始 */for(int i = 1; i < n - k; ++i)head = head->next;/* 第n-k+1个节点变为表头,第n-k个节点变为末尾节点 */ListNode* res = head->next;head->next = nullptr;return res;}/* 如果k为0,说明不需要回转,直接返回表头 */else{return head;}}
};

上面两道题都是将后k个元素移动到前面

  • 对于数组而言,无法像链表一样只改变某几个节点就实现了顺序的改变。但是可以采用三次逆序的方式改变整体的顺序,弥补缺陷
  • 对于链表而言,无法像数组一样直接确定元素个数和定位某个元素,需要分别求得才可以。但是可以通过改变某些节点以达到顺序的改变
  • 二者都需要考虑边界条件,链表最为明显,需要考虑表头以及null节点。

每天一道LeetCode-----将数组/链表后k个元素移动到前面相关推荐

  1. 数组中第K大元素(java多种方式实现)

    题目描述: Leetcode215题:在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5 ...

  2. 在一个无序的int数组上构建一个最小堆的时间复杂度_漫画:寻找无序数组的第k大元素(修订版)...

    ----- 第二天 ----- 题目是什么意思呢?比如给定的无序数组如下: 如果 k=6,也就是要寻找第6大的元素,这个元素是哪一个呢? 显然,数组中第一大的元素是24,第二大的元素是20,第三大的元 ...

  3. 数组中的元素赋值给元素_漫画:寻找无序数组的第k大元素

    本期封面作者:泰勒太乐 -----  第二天  ----- 题目是什么意思呢?比如给定的无序数组如下: 如果 k=6,也就是要寻找第6大的元素,这个元素是哪一个呢? 显然,数组中第一大的元素是24,第 ...

  4. 从当前元素继续寻找_云漫圈 | 寻找无序数组的第k大元素

    戳蓝字"CSDN云计算"关注我们哦! 作者:小灰 来源:程序员小灰 本期封面作者:泰勒太乐 -----  第二天  ----- 题目是什么意思呢?比如给定的无序数组如下: 如果 k ...

  5. 云漫圈 | 寻找无序数组的第k大元素

    戳蓝字"CSDN云计算"关注我们哦! 作者:小灰 来源:程序员小灰 本期封面作者:泰勒太乐 -----  第二天  ----- 题目是什么意思呢?比如给定的无序数组如下: 如果 k ...

  6. 遍历数组是什么意思_漫画:寻找无序数组的第k大元素(修订版)

    ----- 第二天 ----- 题目是什么意思呢?比如给定的无序数组如下: 如果 k=6,也就是要寻找第6大的元素,这个元素是哪一个呢? 显然,数组中第一大的元素是24,第二大的元素是20,第三大的元 ...

  7. js中实现截取数组的后几个元素作为一个新数组的方法

    js中实现截取数组的后几个元素作为一个新数组的方法 有时候我们会遇到这种需求,截取数组中后5个元素作为一个新数组,且顺序不能变.数组中的slice()方法和splice()方法都可以实现这样的操作. ...

  8. Leetcode 215.数组中第k个最大元素 (每日一题 20210713)

    给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素.示例 1:输入: [3,2,1,5,6,4] 和 ...

  9. Leetcode——2053. 数组中第 K 个独一无二的字符串

    数组中第 K 个独一无二的字符串 题目 解题思路 题目 独一无二的字符串 指的是在一个数组中只出现过 一次 的字符串. 给你一个字符串数组 arr 和一个整数 k ,请你返回 arr 中第 k 个 独 ...

最新文章

  1. ES6--函数的扩展
  2. java ee 分页_【JavaEE】JavaEE分页实践
  3. 北大暑期课作业 - 对cnblog 和其他技术博客的分析,比较和展望
  4. centos7开放80端口_Centos7.4系统 httpd模式搭建文件服务器
  5. day25-3 json,pickle模块
  6. 通过RxJS理解响应式编程
  7. android edittext drawable,android – 在事件上显示复合drawable到EditText
  8. SMT32F767通过STM32CUBE HAL库配置QSPI和W25Q256驱动
  9. 大数据和小数据有什么区别?
  10. win10系统通过文件名称快速搜索文件的软件
  11. VB连接Sql Server,Oracle,SyBase,Access数据库操作实例
  12. 思维误区:努力学习与有效学习!不要做无用功
  13. primary key与unique的区别
  14. 王爽汇编语言 实验5
  15. warning: LF will be replaced by CRLF in bispython/venv/Lib/site-packages/dja
  16. python开发工具pycharm插件美化代码_精选Pycharm里6大神器插件
  17. hexo下next主题实现鼠标移动特效
  18. 2017年计算机应用基础自考试题,三問美育科目進中考
  19. hotmail手机端_Hotmail下载_Hotmail官方app手机最新版安装 - 人人下载
  20. 职场分享:工作中我们需要进行情绪管理

热门文章

  1. python语言用什么来表明每行代码的层次关系_2021年尔雅通识课《切削原理与刀具》课后习题答案...
  2. Java黑皮书课后题第3章:**3.9(商业:检验ISBN-10)ISBN-10由10个个位整数d1d2d3d4d5d6d7d8d9d10组成,最后一位d10是校验和,输入前9个数,显示10位ISBN
  3. linux 跨IP拷贝命令 scp
  4. mysql,mybatis常用小知识点
  5. HTTPS连接的前几毫秒发生了什么
  6. Oracle SQL语句大全(三)
  7. linq to object 、linq to sql 、linq to entity 批量 新增、更新、删除功能扩展
  8. 如何向本地MSDN帮助库中添加和修改一些帮助内容
  9. 操作系统实验报告2:Linux 下 x86 汇编语言1
  10. [系统安全] 六.逆向分析之条件语句和循环语句源码还原及流程控制