本博客的博文为原创,引用到的内容本人也标注明出处。
第一次接触到reverse方法的时候给我非常强烈的空间旋转的感觉,所以这里写写笔记。非常遗憾没有找到手掌翻转的插图。
找个例子来讲吧,比较经典的list循环移动。
eg:L = [1,2,3,4,a,b,c,d],循环右移k位,要求时间复杂度O(n),空间复杂度O(0)。
首先进行一个小优化,因为k可能非常大,所以对它进行模处理:
k %= len(L)
算法过程:
1)对L[0:len(L) - k - 1]进行逆序排列。
2)对L[len(L) - k:]进行逆序排列。
3)对于整个L进行逆序排列。
定义一个基础操作:
Reverse(int *a, int idxs, int idxe)
{
int tmp = 0;
for(; idxs < idxe; idxs++, idxe--)
{
tmp = a[idxe];
a[idxe] = a[idxs];
a[idxs] = tmp;
}
}
过程:
Reverse(a, 0, len(L) - k - 1)
Reverse(a, len(L) - k, len(L) - 1)
Reverse(a, 0, len(L) - 1)
谢谢拜读