问题:将一个n元一维向量向左旋转i个位置, 例如 将 abcdefg 左旋转3个位置,得到结果 defgabc
问题比较简单,这里记录一种巧妙的解法。
不妨将向量A划分为ab 两段,即A = ab, a 部分即为需要左旋转的部分,如上例中的abc。我们想得到的目标结果是B = ba。
将ab两部分分别作翻转记做a'b', 然后对a'b' 整体做翻转结果即为ba, 总感觉这背后的原理跟某种矩阵操作有关,一时记不起来了。先简单理解吧。
简单写代码验证了一下:
void Reverse(char *pStart, char *pEnd)
{
if(pStart == NULL || pEnd == NULL)
{
return;
}
char temp;
while(pStart < pEnd)
{
temp = *pStart;
*pStart = *pEnd;
*pEnd = temp;
pStart++;
pEnd--;
}
}
void ShiftWord(char *pWord, int index, int len)
{
if(pWord == NULL)
{
return;
}
Reverse(pWord, pWord + index - 1);
Reverse(pWord + index, pWord + len - 1);
Reverse(pWord, pWord + len - 1);
}