网站首页 > 精选教程 正文
题目:
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
进阶:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?
示例:
输入: nums = [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]
思路一:
临时数组存储最后k个元素,原数组前n-k个元素移动到尾部,再从临时数组把数据移到原数组首部。
思路二:
数组翻转。先翻转全部数组,然后翻转前k个元素,最后翻转后n-k个元素。
代码一(临时数组):
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int n = nums.size();
if(n <= 1)
return;
k = k%n;
if(k == 0)
return;
vector<int> tmp;
for(int i=n-k; i<n; i++)
{
tmp.push_back(nums[i]);
}
for(int i=n-k-1; i>=0; i--)
{
nums[i+k] = nums[i];
}
for(int i=0; i<k; i++)
nums[i] = tmp[i];
}
};
代码二(数组翻转):
class Solution {
public:
void reverse(vector<int>& nums, int begin, int end)
{
while(begin < end)
{
swap(nums[begin], nums[end]);
begin++;
end--;
}
}
void rotate(vector<int>& nums, int k) {
int n = nums.size();
if(n <= 1)
return;
k = k%n;
if(k == 0)
return;
reverse(nums, 0, n-1);
reverse(nums, 0, k-1);
reverse(nums, k, n-1);
}
};
猜你喜欢
- 2024-11-13 面试:聊一聊 Java 数组默认的排序算法,我懵了
- 2024-11-13 golang2021数据格式(6)数组逆置 golang数组转字符串
- 2024-11-13 使用DeepClone沿数组对角线翻转180度
- 2024-11-13 深入理解 JavaScript 数组方法:从零实现 reverse 方法
- 2024-11-13 程序员面试算法题之数组[3],反转整数
- 2024-11-13 Vue短文:如何使用v-for反转数组的顺序?
- 2024-11-13 Java重学—进阶知识 java重点知识回顾
- 2024-11-13 关于数组,你必须要知道的几大算法
- 2024-11-13 python经典案例:将一个数组逆序输出
- 2024-11-13 shell中如何逆序打印数组的内容,或者反转一个数组?
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)