leetcode Rotate Array 旋转数组
2015-08-03 17:28
323 查看
Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].即给定移动数k,向右循环移动k位:
最简单想到的就是借助一个临时数组存储循环移动k位后的数:
还有就是简单的step by step即向右移动k位分成k次向右移动一位:
还有一种做法是:先将数组全部反序,再根据移动位数k先将前k位又反序,再将最后k-numsSize数字反序即可:
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].即给定移动数k,向右循环移动k位:
最简单想到的就是借助一个临时数组存储循环移动k位后的数:
void rotate(int* nums, int numsSize, int k) { int *p=(int *)malloc(sizeof(int)*numsSize); memset(p,0,sizeof(p)); for(int i=0;i<numsSize;i++) p[(i%numsSize+k)%numsSize]=nums[i]; for(int i=0;i<numsSize;i++) nums[i]=p[i]; }
还有就是简单的step by step即向右移动k位分成k次向右移动一位:
void rotate(int* nums, int numsSize, int k) { int temp; for(int i=0;i<k;i++){ temp=nums[numsSize-1]; for(int j=numsSize-1;j>0;j--) nums[j]=nums[j-1]; nums[0]=temp;} for(int j=0;j<=numsSize-1;j++) cout<<nums[j]<<" "; }不过很遗憾,这种做法太复杂,结果显示: Time Limit Exceeded
还有一种做法是:先将数组全部反序,再根据移动位数k先将前k位又反序,再将最后k-numsSize数字反序即可:
void reverse(int *a,int *off){ int *p=(int *)malloc(sizeof(int)*(off-a)); for(int i=0;i<(off-a);i++) p[i]=*(off-i-1); for(int i=0;i<(off-a);i++) a[i]=p[i]; } void rotate(int* nums, int numsSize, int k) { k=k%numsSize; reverse(nums,nums+numsSize); reverse(nums,nums+k); reverse(nums+k,nums+numsSize); }
相关文章推荐
- C++ 命名空间
- About Transaction Log
- Volley框架支持HTTPS请求。
- 【Android多媒体】NuPlayer for HTTP Live Streaming【3】
- ArcGIS教程:水文分析应用示例
- 解决visual studio2010打开web项目无权限的问题
- Android基础--Java1234
- iOS开发UI篇—在UITableview的应用中使用动态单元格来完成app应用程序管理界面的搭建
- 排序算法
- iptables规则的查看、添加、删除和修改
- java.lang.UnsatisfiedLinkError:Could not load bd_wsp_v1_0 loader dalvik.system
- WebX5手机GPS定位,无需开启网络
- setsockopt、getsockopt详细介绍(转)
- 在微信调试中如何将本地IP发布到外网,以便更好的Dug调试
- WebSocket
- 老年尿毒症患者腹透置管术的一些经验
- 老年连续性非卧床腹膜透析相关性腹膜炎临床分析
- scanf("%s",s);语句输入
- WebSocket
- 安卓天天练练(七)轮播图