试设计算法得到原数组循环右移 k 次的 结果并分析算法的时间复杂度。

试设计算法得到原数组循环右移 k 次的 结果并分析算法的时间复杂度。

1.问题描述

已知一个长度为 n 的数组和一个正整数 k,并且最多只能使用一个用于 交换数组元素的附加空间单元,试设计算法得到原数组循环右移 k 次的 结果并分析算法的时间复杂度。

2.解决思路

根据三步反转法,实现时间复杂度为O(n),空间复杂度为O(1)
过程:

  • 1、将整体数组进行反转,原顺序1,2,3,4,5,6,7,8,9变为9,8,7,6,5,4,3,2,1
  • 2、将前K-1个数进行反转,比如K=2,则结果为:8,9,7,6,5,4,3,2,1
  • 3、将后K个数进行反转,结果:8,9,1,2,3,4,5,6,7

3.代码实现

golang code:

package main

import "fmt"

func Do(arr []int64, k int) {
    if k > len(arr) {
        fmt.Println("error,k is beyond array length")
    }

    // 三步反转法
    Reverse(arr, 0, len(arr)-1)
    Reverse(arr, 0, k-1)
    Reverse(arr, k, len(arr)-1)

}
func Reverse(arr []int64, start, end int) {
    for start < end {
        arr[start], arr[end] = arr[end], arr[start]
        start++
        end--
    }
}

func main() {
    arr := []int64{1, 2, 3, 4, 5, 6, 7, 8, 9}
    Do(arr, 5)
    fmt.Println(arr)

}

推荐阅读更多精彩内容

  • 1.把二元查找树转变成排序的双向链表题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建...
    锐心凌志阅读 6,199评论 2 31
  • 算法 Algorithm 算法是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描...
    卡尔是正太阅读 5,529评论 2 53
  • 字符串匹配KMP算法详解 1. 引言 以前看过很多次KMP算法,一直觉得很有用,但都没有搞明白,一方面是网上很少有...
    张晨辉Allen阅读 1,519评论 0 3
  • 活动主题:你的知识如何管理? 活动日期:2019年2月9日(大年初五)14:40-17:00 活动地点:武昌九丘书...
    静心教育静姐阅读 230评论 0 2
  • 京畿一带,常有从渤海之外而来的朔风,未及九月,便呼啸而至,时年才入深秋,疾风卷地,枝头黄叶如大雨骤跌,庭前百花一夕...
    苑小月阅读 184评论 1 2
  • 最近几年读书风气盛行,好多人都在为知识付费,这是好现象,但是又存在另一个情况,屯了好多书,却没有看,占用了很多空间...
    翔子52双鱼阅读 137评论 0 2