3. 数组翻转
给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
3.1 方案一
var rotate = function (nums, k) {
// 得到求余后翻转值
let change = k % nums.length;
// 割去需要翻转的部分
let newNums = nums.splice(nums.length - change, change);
// 将割去的部分填入开头
nums.splice(0, 0, ...newNums);
};
思路 : 首先为了方便阅读, 先得到求余后翻转的值change, 这一步是为了避免nums.length < k的情况, 接着割去翻转的部分, 假设nums = [1, 2, 3, 4, 5, 6, 7], 若 k = 3 , 那么割去的部分为 [5, 6, 7], 然后再将这部分用splice方法添加到开头中, 并且注意不是使用newNums, 而是需要用到ES6的扩展运算符方法, 将[5, 6, 7] 转换成参数序列5, 6, 7
时间复杂度 : O(n)
注意, splice方法的时间复杂度是O(n)
空间复杂度 : O(k)
3.2 方案二(超出时间限制)
var rotate = function (nums, k) {
if (k >= 0) {
for (let i = 0; i < k; i++) {
let last = nums[nums.length - 1];
nums.pop();
nums.unshift(last);
}
}
};
先说一下, 这个方案是超时的, 但是值得拿出来说一下, 为了避免后续踩坑, 后面会说明为什么超时
思路 : 检测k是否>=0 (题目要求k为非负数), 进入循环, 循环k次, 每一次循环都是将数组的最后一个值存起来, 并且放入开头, 还要记得删掉最后一个值, 循环结束就能得到翻转数组
时间复杂度 : O(n * k)
分析 : 因为unshift()的源码使用到了for循环, 所以unshift的时间复杂度已经是O(n)了, 再加上最外层k次的循环, 时间复杂度为O(n * k), 因此超出了力扣规定的时间
空间复杂度 : O(1)
PS : 作者只是个算法萌新, 觉得方案有不妥的, 轻喷, 十分欢迎讨论与指正, 并且如果有更好的方案, 那就更欢迎了.接下来会慢慢更新每一题算法, 需要的可以点个关注不迷路=.=