面试题4:数组旋转

题目:返回将一维数组向右旋转k个位置的结果。比如,一维数组{1,2,3,4,5},k=2时,返回结果时{4,5,1,2,3}。要求常数级空间复杂度,允许修改原来数组。

书中给出的思路:

    如果允许额外分配线性空间,那么可以错位复制原有数组的元素。如果允许修改原有数组,那么我们可以通过三次反转数组来实现数组旋转,不需要申请额外空间,并且每次反转时间为O(n),从而实现线性的时间复杂度和常数级的空间复杂度。

    三次反转:第一次反转整个数组;第二次反转前k个;第三次反转剩下的数。例如:

        一维数组{1,2,3,4,5},k=2

        第一次反转:5,4,3,2,1

        第二次反转:4,5,3,2,1

        第三次反转:4,5,1,2,1     即为最终结果


书上的代码实现:

func totateK(s []int, k int) []int {
	if len(s) != 0 && k < len(s) {
		reverse(s, 0, len(s)-1)
		reverse(s, 0, k - 1)
		reverse(s, k, len(s)-1)
	}
	return s
}

func reverse(a []int, start ,end int) {
	for start < end {
		// 交换a[start]和a[end]两个数
		a[start], a[end] = a[end], a[start]
		start++
		end--
	}
}

我自己的思路实现:

func totateK(s []int, k int) []int {
	t := s[len(s)-k:]
	return append(t, s[:len(s)-k]...)
}

猜你喜欢

转载自blog.csdn.net/qq_35191331/article/details/80209204