golang_算法: leetcode_数组03-旋转数组

版权声明:本文为博主原创文章,转载请附上博文链接! https://blog.csdn.net/weixin_43851310/article/details/87907685
import "fmt"

//空间复杂度为 O(1) ,不能使用其它数组
////设计算法:
////1.新建空间,将后k位数截取,后k位和前面的数字分别添加到新空间
//func rotate1(nums []int, k int) {
//	var arr []int
//	l := len(nums)
//	arr = append(nums[(l-k):], nums[:l-k]...)
//	nums = arr
//	fmt.Println(nums)
//}
//
////2.将前l-k添加最后,截取从l-k位后l位的数组
//func rotate2(nums []int, k int) {
//	l := len(nums)
//	arr := append(nums, nums[:l-k]...)
//	nums = arr
//	fmt.Println(arr)
//	//fmt.Println(nums[l-k:])
//}
//
////3.前l-k位数下标+k,后k位数下标-k

//1.将最后一位数存在一个临时变量里,其它数右移一位,然后重复上面操作
func rotate4(nums []int, k int) {
	l := len(nums) //7
	for i := 0; i < k; i++ {
		tmp := nums[l-1]
		for j := l - 1; j > 0; j-- {
			nums[j] = nums[j-1]
		}
		nums[0] = tmp
	}
	fmt.Println(nums)
}

//2.进行3次反转,第一次整体反转,第二次前k个反转,第三次后l-k个反转
func rotate5(nums []int, k int) {
	l := len(nums)
	k = k % l
	reverse(nums,0,l-1)
	reverse(nums,0,k-1)
	reverse(nums,k,l-1)
}

func reverse(nums []int, i, j int) {
	for i < j {
		nums[i], nums[j] = nums[j], nums[i]
		i++
		j--
	}
}

func main() {
	nums := []int{1, 2, 3, 4, 5, 6, 7}
	var k int = 3
	//rotate4(nums, k)
	rotate5(nums, k)

	fmt.Println(nums)
}

Output:

[5 6 7 1 2 3 4]

猜你喜欢

转载自blog.csdn.net/weixin_43851310/article/details/87907685
今日推荐