Given an array, rotate the array to the right by k steps, where k is non-negative.

给定一个数组,并且给定一个非负数的值k, 把数组往右旋转k步,要求不返回新的数组,直接改变原数组

例子1:

给定数组: [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] 我的初步解法
var rotate = function(nums, k) {
let tempArr = nums.slice(0, nums.length-k) // 首先截取数组前半段保存到一个新的数组tempArr里
nums.splice(0, nums.length-k) // 使用splice直接截去前半段数组,只保留后半段子数组到nums里
for(let i=0; i<tempArr.length; i++){ // 循环遍历tempArr,把元素一个个push到nums里
nums.push(tempArr[i])
}
console.log(nums)
};

这个解法并没有通过leetCode的检查,原因是,当我的数组

nums = [1,2]

k =3

的时候并没有返回正确的值,这是因为这里,没有考虑到 k 的值大于数组长度的情况,于是,我又修改了一下逻辑,增加了对这种情况的判断

var rotate = function(nums, k) {
if(nums.length < k){ // 在这里增加对k>nums.length这种情况的判断
k = k-nums.length
}
let tempArr = nums.slice(0, nums.length-k)
nums.splice(0, nums.length-k)
for(let i=0; i<tempArr.length; i++){
nums.push(tempArr[i])
}
console.log(nums)
};

至此,就满足了上面nums=[1,2] ,k=3的情况,并且也成功通过了leetCode的检测

但是,后来发现,假如我把k增大到 nums长度的几倍以后,程序就不管用了,不会旋转,原因是 数组长度只有2,当我设k为8的时候,k = k-nums.length, 这里k还是等于6,所以,slice(0,6)和splice(0,6)方法都不起作用,下标超出了数组长度

参考了别人的解答之后,发现求模才是万能的啊,于是乎改成这样

var rotate = function(nums, k) {
k %= nums.length // 求模
let tempArr = nums.slice(0, nums.length-k)
nums.splice(0, nums.length-k)
for(let i=0; i<tempArr.length; i++){
nums.push(tempArr[i])
}
console.log(nums)
};

从上面这道题里面收获良多,一个是对slice和splice用法的理解更深入了一些,另一个是程序的严谨性,一定要考虑多种可能情况,发散思维,各种边界值也要考虑到

以下是别人的JS解法

解法一:

每个数组元素的index,直接加上k,比如下图中的k=2,加完之后也要考虑index值大于数组长度的情况比如元素6加2之后是7,超出长度6, 则元素6的新index应该为1(7-6=1),

跟上面一样,需要考虑k几倍大于数组length的情况,所以还是采用求模的方式

var rotate = function(nums, k) {
let tempArr = []
for(let i=0; i<nums.length; i++){ // 用一个新的数组保存旋转之后的数组
tempArr[(i+k) % nums.length] = nums[i]
}
for(let j=0; j<nums.length; j++){ // 让原数组等于旋转后的新数组,改变原数组
nums[j] = tempArr[j]
}
console.log(nums)
};

解法二,利用pop 和unshift,非常简洁,Awesome!

var rotate = function(nums, k) {
k %= nums.length
for(var i = 0; i < k; i ++){
nums.unshift(nums.pop()); //先把元素从最末尾取出来之后,再放到最前面
}
console.log(nums)
};

解法三,利用ushift 和 splice,也是非常好的方法

var rotate = function(nums, k) {
k %= nums.length
nums.unshift(...nums.splice(nums.length - k, k)); //...不能少,否则会把整个截取出来的数组作为一个元素放到nums里
console.log(nums)
};
 

Rotate Array 旋转数组 JS 版本解法的更多相关文章

  1. [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  ...

  2. [LeetCode] 189. Rotate Array 旋转数组

    Given an array, rotate the array to the right by k steps, where k is non-negative. Example 1: Input: ...

  3. rotate array 旋转数组

    class Solution {public: void rotate(vector<int>& nums, int k) { int n=nums.size(); int i=0 ...

  4. 189 Rotate Array 旋转数组

    将包含 n 个元素的数组向右旋转 k 步.例如,如果  n = 7 ,  k = 3,给定数组  [1,2,3,4,5,6,7]  ,向右旋转后的结果为 [5,6,7,1,2,3,4].注意:尽可能找 ...

  5. LeetCode Rotate Array 翻转数组

    题意:给定一个数组,将该数组的后k位移动到前n-k位之前.(本题在编程珠玑中第二章有讲) 思路: 方法一:将后K位用vector容器装起来,再移动前n-k位到后面,再将容器内k位插到前面. class ...

  6. Find Minimum in Rotated Sorted Array(旋转数组的最小数字)

    题目描述: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., might become ...

  7. C++旋转数组(三种解法详解)

    题目描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 附加要求 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题. 你可以使用空间复杂度为 O(1) 的 原地 ...

  8. 189. Rotate Array -- 将数组前一半移到后一半

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array ...

  9. rotate image(旋转数组)

    You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...

随机推荐

  1. mac OSX 实用快捷键

    Command + shift + G. 前往文件夹 按键 效果 Shift + option + 音量+/- 以四分之一的刻度加 / 减音量 Shift. + option + 9 ······

  2. 在一个activity中销毁指定activity

    通过静态变量的方法: 1.在Aactivity中设置一个Activity静态变量 static Activity activity; 2.在onCreate中: activity=this: 3.在B ...

  3. cogs 1962. [HAOI2015]树上染色

    ★★☆   输入文件:haoi2015_t1.in   输出文件:haoi2015_t1.out   简单对比 时间限制:1 s   内存限制:256 MB [题目描述] 有一棵点数为N的树,树边有边 ...

  4. 骁龙820和KryoCPU:异构计算与定制计算的作用 【转】

    本文转载自:https://www.douban.com/group/topic/89037625/ Qualcomm骁龙820处理器专为提供创新用户体验的顶级移动终端而设计.为实现消费者所期望的创新 ...

  5. 平衡树之伸展树(Splay Tree)题目整理

    目录 前言 练习1 BZOJ 3224 普通平衡树 练习2 BZOJ 3223 文艺平衡树 练习3 BZOJ 1588 [HNOI2002]营业额统计 练习4 BZOJ 1208 [HNOI2004] ...

  6. JavaScript 获取地址栏参数

    1. function a() { console.log(this); } a.call(null); window 如果第一个参数传入的对象调用者是null或者undefined的话,call方法 ...

  7. 翻译header

    !/usr/bin/env pyhton --coding:utf-8-- import urllib.request import urllib.parse import os,sys import ...

  8. 发现 一个 http 压测库

    代码库:https://github.com/wg/wrk 安装 https://github.com/wg/wrk

  9. JDK tools之jps和jstack诊断Java程序

    大部分Java开发者可能知道有这么个工具,但是没怎么用过,每次还得百度一下.我也是之一 -_-!!. 每次遇到

  10. hdu 5493 Queue 树状数组第K大或者二分

    Queue Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submi ...