题目地址 : 旋转数组.

网上好多不是根本就是错的,就是空间复杂度不是真正为1

下面总结一下

方法1

普通方法(空间复杂度不满足要求,但是题目并不会判错,说明他们没用对空间进行校验)

···

public void rotate1(int[] nums, int k) {

if(nums.length == 1 || k == 0) return;

    k = k % nums.length;
int[] ans = new int[nums.length];
for (int i = 0, j = k; i < nums.length; i++) {
ans[j] = nums[i];
j = (j+1) % nums.length;
}
System.out.println("Arrays.toString(ans) = " + Arrays.toString(ans));
for(int i = 0; i < nums.length; i++){
nums[i] = ans[i];
}
}

···

方法2:

3次倒置,这个方法思路很巧妙,很经典。

先全部倒置,然后0到k-1倒置,然后k到最后再倒置,就得到了正确结果,空间复杂度1,(交换只耗费1个额外空间)

倒置当然要自己写,用java自带的肯定就超过1空间复杂度了

方法3

这是我自己想的方法,每次把当前的给正确的位置,然后在把正确位置上的那个再给下一个正确的位置,但是这个方法有个坑,就是不一定一次轮回就能搞定,如果k和length都是偶数就会超过一次轮回。

我也没研究出来到底是几次轮回,但是有一种简单的方法,就是每次调换一次,就cnt++,当cnt==length的时候就完成了。在这之前不断轮回,每次轮回,从当前的位置+1. 第一次轮回把nums[0]当成一个临时变量(每次轮回完了,num[0]自动会是正确的数字, 第二次轮回就是num[1]...)

public void rotate(int[] nums, int k) {
if(nums.length == 1 || k == 0) return;
k = k % nums.length;
int cnt = 0, r = 0, j;
while(cnt < nums.length){
j = k + r;
while (true) {
System.out.println(nums[r] + " " + nums[j]);
int t = nums[j];
nums[j] = nums[r];
nums[r] = t;
j = (j + k) % nums.length;
cnt++;
if(j == r){
cnt++;
break;
}
}
System.out.println(Arrays.toString(nums));
r++;
}
// System.out.println( Arrays.toString(nums));
}

旋转数组 空间复杂度为O(1) 的2 种方法 + 1种空间复杂度O(n)的更多相关文章

  1. leetCode 81.Search in Rotated Sorted Array II (旋转数组的搜索II) 解题思路和方法

    Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this ...

  2. 《剑指offer》面试题8 旋转数组的最小数字 Java版

    (找递增排序旋转数组中的最小数字) 书中方法:这种题目就是要寻找数组的特点,然后根据这个特点去写.旋转后的递增数组分为两段递增序列,我们找到中点,如果比第一个元素大,表示在第一段递增序列里,如果比第一 ...

  3. C# byte[]数组和string的互相转化 (四种方法)

    C# byte[]数组和string的互相转化 (四种方法) 第一种 [csharp] view plain copy string str = System.Text.Encoding.UTF8.G ...

  4. js数组和字符串去重复几种方法

    js数组去重复几种方法 第一种:也是最笨的吧. Array.prototype.unique1 = function () { var r = new Array(); label:for(var i ...

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

  6. 【LeetCode每天一题】Search in Rotated Sorted Array(在旋转数组中搜索)

    Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.(i.e., ...

  7. leecode刷题(3)-- 旋转数组

    leecode刷题(3)-- 旋转数组 旋转数组 给定一个数组,将数组中的元素向右移动 K 个位置,其中 K 是非负数. 示例: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5, ...

  8. 旋转数组 [ LeetCode ]

    原题地址:https://leetcode-cn.com/problems/rotate-array/description/ 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. ...

  9. 剑指Offer - 九度1386 - 旋转数组的最小数字

    剑指Offer - 九度1386 - 旋转数组的最小数字2013-11-24 01:57 题目描述: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转 ...

随机推荐

  1. go依赖包管理工具vendor基础

    go依赖包管理工具vendor基础 vendor是go的依赖包管理工具,主要用于管理项目中使用到的一些依赖. 它将项目依赖的包,特指外部包,复制到当前工程下的vendor目录下,这样go build的 ...

  2. vue 简介 vue 项目 组件

    1. 概念 Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.能够为复杂的单页应用提供驱动. 2. 用法 2.1 声明式渲染 2.1.1 改变文本     {{ m ...

  3. Apple历史应用以及开发工具版本(Xcode官方历史版本等等)

    1.Xcode 官方历史版本下载:(需要登录开发者账号) https://developer.apple.com/download/more/

  4. php实用小技巧【持续更新】

    这是本人开始做项目的时候遇到过的问题还有解决方法 1.eval函数 能把字符串转换成可执行的php代码,如果字符串不是可执行的php代码的话,需要在前面加上@,屏蔽notice 2.array_mer ...

  5. aria2的安装与配置

    aria2安装 安装 epel 源: yum install epel-release 然后直接安装: yum install aria2 -y 配置 Aria2 创建目录与配置文件 这一步需要切换到 ...

  6. Ubuntu 安装uwsgi出错

    1.分析了下,感觉是gcc除了问题,百度了一下,发现有类似的解决办法,记录一下. Collecting uwsgi Using cached https://files.pythonhosted.or ...

  7. PIL 中的 Image 模块

    转载:http://www.cnblogs.com/way_testlife/archive/2011/04/20/2022997.html   PIL 中的 Image 模块 本文是节选自 PIL ...

  8. Django学习系列3:创建仓库

    在创建仓库之前,在项目superlists中新建一个Python文件,命名为functional_tests.py,里面的内容如下: # File: functional_test.py # Auth ...

  9. Mybatis 动态sql(转载)

    原文地址:http://www.cnblogs.com/dongying/p/4092662.html 传统的使用JDBC的方法,相信大家在组合复杂的的SQL语句的时候,需要去拼接,稍不注意哪怕少了个 ...

  10. MyBatis:Parameter Maps collection does not contain value for 的问题解决

    Result Maps collection does not contain value for   frontpreviewprofitManage.cdata 出现上述错误 主要是因为你的sel ...