问题
请将一个具有n个元素的一维向量向左旋转i个位置。例如,假设n=8,i=3
,那么向量abcdefgh
旋转之后得到向量defghabc
。简单编码使用一个具有n个元素的中间向量分n步即可完成此作业。你可以仅使用几十字节的微小内存,花费与n成比例的时间来旋转该向量吗?
解决思路
方法1
将向量x中的前i
个元素复制到一个临时数组中,接着将余下的n-i
个元素左移i个位置,然后再将前i个元素从临时数组中复制回x中的后面位置。
该方案使用i
个额外的位置,如i
足够大,过于浪费空间。
方法2
将这个问题看作是把数组ab转换成数组ba吧,但同时也假定我们具有在数组中转置指定部分元素的函数。我们先从ab开始,转置a得到$a^rb$,再转置b得到$a^rb^r$,然后再转置整个$a^rb^r$得到$(a^rb^r)^r$,实际上就是ba。
- reverse(0, i-1)
- reverse(i, n-1)
- reverse(0, n-1)
该转置代码在时间和空间上都很有效,并且是这么简短和简单,想出错都很难。
程序代码
方法2的代码
1 | #include <stdio.h> |