LeetCode Rotate Array 翻转数组
题意:给定一个数组,将该数组的后k位移动到前n-k位之前。(本题在编程珠玑中第二章有讲)
思路:
方法一:将后K位用vector容器装起来,再移动前n-k位到后面,再将容器内k位插到前面。
- class Solution {
- public:
- void rotate(int nums[], int n, int k) {
- if( !k || !n || n== || k==n ) return;
- k %= n;
- vector<int> cha;
- cha.reserve(k);
- int i;
- for(i=n-k; i<n; i++)//装进容器
- cha.push_back(nums[i]);
- for(i=n-k-; i>=; i--)//移动前n-k位
- nums[i+k]=nums[i];
- for(i=; i<k; i++)//将容器内k个元素移到前面
- nums[i]=cha[i];
- }
- };
Rotate Array
方法二:将后k位自身旋转,再将前n-k位自身旋转,在将整个数组旋转。例如:[1,2,3,4,5,6,7],第一步[1,2,3,4,7,65],第二步[4,3,2,1,7,6,5],第三步[5,6,7,1,2,3,4]。主要工作就是旋转,
- class Solution {
- public:
- void rev(int *q,int *p) //将q与p所指向的区间旋转
- {
- while( q!=p && q!=p+ )
- {
- *q ^= *p;
- *p ^= *q;
- *q ^= *p;
- q++;
- p--;
- }
- }
- void rotate(int nums[], int n, int k) {
- if( !k || !n || n== || k==n ) return;
- k %= n;//这一步很必要
- rev(&nums[n-k],&nums[n-]);//转后k个
- rev(&nums[],&nums[n-k-]);//转前n-k个
- rev(&nums[],&nums[n-]);//转整个
- }
- };
Rotate Array
方法三:为了省空间,当n%k==0时,就可以用这招了。将最后一位取出来,该位置-k的位置上的值就可以放在最后一位上了,其实就是按周期k,将各个元素一步到达其最终的位置上。例如[1,2,3,4,5,6,7,8,9],k=3,先将9用一个变量存起来,那么6就可以移到9的位置上,3就可以移到6的位置上,9可以移到3的位置上。对于8、5、2也是如此。这样就能完成节省空间的目的了。但是,当n%k不为0时,要注意了,按上面做法移动完之后,最前面的k位并不在其最终位置上,比如
[1,2,3,4,5,6,7],k=3,结果却是
[7,5,6,1,2,3,4],第一步是7、4、1没错吧?那7就到了1的位置了,第二步是6、3没错吧,那么只是交换了他们的位置。那么7在第1位,6在第3位,5在第2位,这可以想办法解决的。办法是,前k位中的前(n%k)个元素得接在后面k-(n%k)位的后面,又需要进行一次旋转,太麻烦了,如果这次k%(n%k)又不为0,那么还有得继续!我用的方法是对这前k位直接套用上面第2种方法。速度奇慢!
- class Solution {
- public:
- void rev(int *q,int *p)
- {
- while( q!=p && q!=p+ )
- {
- *q ^= *p;
- *p ^= *q;
- *q ^= *p;
- q++;
- p--;
- }
- }
- void rotate(int nums[], int n, int k) {
- if( !k || !n || n== || k==n ) return;
- k %= n;
- int temp, i, j;
- for(i=; i<=k; i++)
- {
- temp = nums[n-i];
- cout<<temp<<endl;
- for(j=n-i-k; j>=; j-=k)
- {
- nums[j+k] = nums[j];
- cout<<nums[j+k]<<endl;
- }
- nums[j+k] = temp;
- }
- temp=n%k;
- //套用第2种方法
- rev(&nums[],&nums[temp-]);
- rev(&nums[temp],&nums[k-]);
- rev(&nums[],&nums[k-]);
- }
- };
Rotate Array
LeetCode Rotate Array 翻转数组的更多相关文章
- [LeetCode] Rotate Array 旋转数组
Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...
- C++ STL@ list 应用 (leetcode: Rotate Array)
STL中的list就是一双向链表,可高效地进行插入删除元素. List 是 C++标准程式库 中的一个 类 ,可以简单视之为双向 连结串行 ,以线性列的方式管理物件集合.list 的特色是在集合的任何 ...
- 2016.5.16——leetcode:Rotate Array,Factorial Trailing Zeroe
Rotate Array 本题目收获: 题目: Rotate an array of n elements to the right by k steps. For example, with n = ...
- Python3解leetcode Rotate Array
问题描述: Given an array, rotate the array to the right by k steps, where k is non-negative. Example 1: ...
- [LeetCode] 189. Rotate Array 旋转数组
Given an array, rotate the array to the right by k steps, where k is non-negative. Example 1: Input: ...
- Rotate Array 旋转数组 JS 版本解法
Given an array, rotate the array to the right by k steps, where k is non-negative. 给定一个数组,并且给定一个非负数的 ...
- [LeetCode] Patching Array 补丁数组
Given a sorted positive integer array nums and an integer n, add/patch elements to the array such th ...
- [LeetCode] Contiguous Array 邻近数组
Given a binary array, find the maximum length of a contiguous subarray with equal number of 0 and 1. ...
- 189 Rotate Array 旋转数组
将包含 n 个元素的数组向右旋转 k 步.例如,如果 n = 7 , k = 3,给定数组 [1,2,3,4,5,6,7] ,向右旋转后的结果为 [5,6,7,1,2,3,4].注意:尽可能找 ...
随机推荐
- 同台电脑 多Git账号同时使用
前言 有次周末忘记带公司电脑回来,恰好遇到有个问题需要修复,又不想跑公司一趟,于是研究了下如何在自己电脑上同时使用两个 git 账号 正文 1. 首先就和第一次安装 git 时一样,使用 sha算法 ...
- 【linux-./configure 配置文件时出错问题】
环境是:centos 5.6 安装系统时,可能安装的是标准的精简版本,所以没有选择软件依赖包,很多软件都没有安装. 现在需要安装软件,安装软件时报错: make: *** 没有指明目标并且找不到 ma ...
- ASP.NET jquery 获取服务器控件ID
一般方法: jQuery("#txtUserName").val(); 如果页面加载了母版页或者自定义控件:该页面的ID有可能会被篡改(可能是因为避免控件ID冲突的机制),因此强烈 ...
- 安装mongodb并配置
下载网址http://dl.mongodb.org/dl/win32/x86_64 mongodb-win32-x86_64-2008plus-ssl-v3.4-latest.zip 解压d盘命名mo ...
- spring boot之 Bean的初始化和销毁(4)
原文:https://blog.csdn.net/z3133464733/article/details/79189699 -------------------------------------- ...
- 转 rman-08120 以及查询隐含参数
rman-08120 We need RMAN to automatically purge archivelogs from the FRA once they are applied to the ...
- UVALive 5983 二分答案+dp
想了很久都想不出怎么dp,然后发现有些例子,如果你开始不确定起始值的话,是不能dp的,每种状态都有可能,所以只能二分一个答案,确定开始的val值,来dp了. #include <cstdio&g ...
- 还不知道如何使用 IDEA ?教你三招快速掌握 IDEA
前言 IntelliJ IDEA 是一个非常强大的 IDE,拥有许多功能.在 IDEA 中大部分功能都可以用快捷键去完成,如果掌握了大部分快捷键,可以只使用键盘开发了. ps: 最近正在练习快捷键,准 ...
- Spring AOP——Spring 中面向切面编程
前面两篇文章记录了 Spring IOC 的相关知识,本文记录 Spring 中的另一特性 AOP 相关知识. 部分参考资料: <Spring实战(第4版)> <轻量级 JavaEE ...
- 【Windows】命令行查询占用端口信息
Windows上查询443端口被占用的信息: NETSTAT.EXE -nao | findstr "443" 查询结果 杀掉进程: tskill 2888