Rotate Array 旋转数组 JS 版本解法
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 版本解法的更多相关文章
- [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 ...
- [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 旋转数组
class Solution {public: void rotate(vector<int>& nums, int k) { int n=nums.size(); int i=0 ...
- 189 Rotate Array 旋转数组
将包含 n 个元素的数组向右旋转 k 步.例如,如果 n = 7 , k = 3,给定数组 [1,2,3,4,5,6,7] ,向右旋转后的结果为 [5,6,7,1,2,3,4].注意:尽可能找 ...
- LeetCode Rotate Array 翻转数组
题意:给定一个数组,将该数组的后k位移动到前n-k位之前.(本题在编程珠玑中第二章有讲) 思路: 方法一:将后K位用vector容器装起来,再移动前n-k位到后面,再将容器内k位插到前面. class ...
- Find Minimum in Rotated Sorted Array(旋转数组的最小数字)
题目描述: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., might become ...
- C++旋转数组(三种解法详解)
题目描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 附加要求 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题. 你可以使用空间复杂度为 O(1) 的 原地 ...
- 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 ...
- rotate image(旋转数组)
You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). ...
随机推荐
- 20145322 Exp5 MS11_050
20145322 Exp5 MS11_050 实验过程 msfconsole命令进入控制台 使用命令search ms11_050查看针对MS11_050漏洞的攻击模块 使用命令 use exploi ...
- div转svg svg转canvas svg生成图片及图片下载 分享
链接来自:http://blog.csdn.net/u010081689/article/details/50728854
- 【问题解决】An internal error occurred during: "Computing additional info". Could not initialize class javax.crypto.JceSecurityManager
在使用eclipse时对象后使用点操作符时总是会弹出错误,很是烦人 An internal error occurred during: "Computing additional info ...
- 复习_for循环嵌套 及 流程图梳理
原题: 使用for循环输出如下图形: * ** *** **** 分析及做法. 图链接: https://www.processon.com/view/link/5afba745e4b05352c2b ...
- CRLF line terminators导致shell脚本报错:command not found --转载
Linux和Windows文本文件的行结束标志不同.在Linux中,文本文件用"/n"表示回车换行,而Windows用"/r/n"表示回车换行.有时候在Wind ...
- Java实现邮箱激活验证2
SendEmail.java [java] view plaincopyprint? package com.app.tools; import java.util.Date; import ja ...
- Jsp基础语法(由简入杂)
JSP基础语法 一,JSP简介 Jsp是一个简化的Servlet设计,是在服务器端执行,他实现了再Java中使用HTML标签. Jsp是一种动态网页技术标准也是JAVAEE的标准 二,常见动态网站开发 ...
- [Java学习] 再谈Java包
在Java中,为了组织代码的方便,可以将功能相似的类放到一个文件夹内,这个文件夹,就叫做包. 包不但可以包含类,还可以包含接口和其他的包. 目录以"\"来表示层级关系,例如 E:\ ...
- scRNA-seq单细胞测序数据分析工具汇总
本文总结自一篇综述: Computational approaches for interpreting scRNA-seq data 单细胞分析分为两个层次: cell level gene lev ...
- English trip -- VC(情景课)9 C What are they doing? 他们在做什么?
Grammar focus 语法点: 以What 开头的问句 What is/is/are he/she/they doing? Cutting the grass. Walking the dog. ...