编程珠玑I第2版 P14
数组循环移位即求:
AB=>BA
A、B为2个向量
而BA=(ArBr)r,r为对向量颠倒
void Reverse(int A[],int l,int r)
{
for(;l<r;l++,r--)
{
int temp=A[l];
A[l]=A[r];
A[r]=temp;
}
}
//if c is positive:leftShift else rightshift
void Shift(int A[],int l,int r,int c)
{
int len=r-l+1;
assert(len>=1);
c%=len;
if(c<0)
c+=len;
Reverse(A,l,l+c-1);
Reverse(A,l+c,r);
Reverse(A,l,r);
}
void PrintArray(int A[],unsigned len)
{
for(int i=0;i<len;i++)
cout << A[i] << '/t';
}
int main()
{
int A[]={1,2,3,4,5,6,7};
int len=sizeof(A)/sizeof(int);
PrintArray(A,len);
cout << endl;
for(int i=-10;i<10;i++)
{
cout << i << ':' << endl;
Shift(A,0,len-1,i);
PrintArray(A,len);
cout << endl;
Shift(A,0,len-1,-i);
PrintArray(A,len);
cout << endl;
}
system("pause");
return 0;
}
按单词反转字符串,即:
输入:Rose is red.
输出:red. is Rose
即:
AB...XYZ=>ZYX...BA
A,B....均为一个向量(字符串中即为单词、空格符)
ZYX...BA=(ArBr...XrYrZr)r,r为向量颠倒
char sentence[1000];
void Reverse(char arr[],int left,int right)
{
for(int i=left,j=right;i<j;i++,j--)
swap(arr[i],arr[j]);
}
void ReverseWordInSentence(char sen[])
{
int len=strlen(sen);
int i=0,j=-1;
while(1)
{
while(i < len && isspace(sen[i]))
i++;
if(i >= len)
break;
j=i;
while(j < len && !isspace(sen[j]))
j++;
j-=1;
//maintain [i,j] is a word
Reverse(sen,i,j);
i=j+1;
}
Reverse(sen,0,len-1);
}
int main ()
{
while(1)
{
gets(sentence);
ReverseWordInSentence(sentence);
printf("%s/n/n",sentence);
}
system("pause");
return 0;
}
由于空格符如space,/t等是否颠倒对显示出来的效果无影响,所以不错颠倒的处理