博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
189. Rotate Array
阅读量:2351 次
发布时间:2019-05-10

本文共 2455 字,大约阅读时间需要 8 分钟。

题目

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

Example 1:

Input: [1,2,3,4,5,6,7] and k = 3

Output: [5,6,7,1,2,3,4]
Explanation:
rotate 1 steps to the right: [7,1,2,3,4,5,6]
rotate 2 steps to the right: [6,7,1,2,3,4,5]
rotate 3 steps to the right: [5,6,7,1,2,3,4]

我的想法

先把数组尾部会被移到头部的元素取出,再按照步长移动数组内元素,最后将取出的元素补回头部

但如果步长大于数组长度,则会出错!!!
解决方案:利用k%nums.length去除周期

class Solution {
public void rotate(int[] nums, int k) {
if(nums.length == 1 || k == 0) return; k = k%nums.length; //去除周期 int[] buff = new int[k]; for(int i = 0; i < k; i++){
int index = nums.length - k + i; buff[i] = nums[index]; } for(int i = nums.length - 1; i > k-1; i--){
int index = i - k; nums[i] = nums[index]; } for(int i = 0; i < k; i++){
nums[i] = buff[i]; } }}

解答

leetcode solution 1:Using Extra Array

用除数取余来表示新的位置
注意:周期性问题可以考虑除数取余!

public class Solution {
public void rotate(int[] nums, int k) {
int[] a = new int[nums.length]; for (int i = 0; i < nums.length; i++) {
a[(i + k) % nums.length] = nums[i]; } for (int i = 0; i < nums.length; i++) {
nums[i] = a[i]; } }}

leetcode solution 2:Using Cyclic Replacements

在这里插入图片描述

public class Solution {
public void rotate(int[] nums, int k) {
k = k % nums.length; int count = 0; for (int start = 0; count < nums.length; start++) {
int current = start; int prev = nums[start]; do {
int next = (current + k) % nums.length; int temp = nums[next]; nums[next] = prev; prev = temp; current = next; count++; } while (start != current); } }}

leetcode solution 3:Using Reverse

很tricky
第一次整个数组的反转是为了把尾部移出去的元素换到头部。但因为整个数组反转后导致顺序变化,后面两次反转恢复原来的数组顺序

public class Solution {
public void rotate(int[] nums, int k) {
k %= nums.length; reverse(nums, 0, nums.length - 1); reverse(nums, 0, k - 1); reverse(nums, k, nums.length - 1); } public void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; start++; end--; } }}

转载地址:http://mfqvb.baihongyu.com/

你可能感兴趣的文章
Apache Kylin 2.3 构建Cube失败
查看>>
Apache Kylin 2.3 样例分析
查看>>
Apache Kylin 2.3 JDBC Java API 示例
查看>>
An internal error occurred during: "Initializing Java Tooling". java.lang.NullPointerException
查看>>
ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
查看>>
IntelliJ IDEA 2018 基本配置
查看>>
Spring+Mybatis+多数据源(MySQL+Oracle)
查看>>
Mybatis读取Oracle数据库Blob字段,输出原文件
查看>>
信用卡反欺诈
查看>>
线性回归
查看>>
浏览器以只读方式打开PDF
查看>>
CDH和HDP下载地址
查看>>
MysqlDataTruncation: Data truncation: Incorrect string value: '\xF0\x9D\x90\xB6"#...' for column
查看>>
.MysqlDataTruncation: Data truncation: Data too long for column 'content' at row 1
查看>>
com.mysql.jdbc.PacketTooBigException: Packet for query is too large (1146177 > 1048576).
查看>>
Elasticsearch 7.x生产配置
查看>>
AccessDeniedException: /opt/elasticsearch-7.0.0/config/elasticsearch.keystore
查看>>
bootstrap-table 父子表 联动表 完整例子
查看>>
Spring Cloud 2.x完整入门Demo样例(Greenwich版本)
查看>>
Spring Cloud 2.x学习笔记:2、feign改进(Greenwich版本)
查看>>