问题:编写反转字符串的程序,要求优化速度、优化空间。
此处以整型数组为例,代码如下:
/*用位运算快速交换两个数,注意必须确保两个数不是同一实例*/ #define swap(a, b) {*(a) ^= *(b); *(b) ^= *(a); *(a) ^= *(b);} /*翻转数组*/ void reverse(int arr[], int len) { int halflen = len / 2; int iend = len - 1; for(int i=0; i < halflen; i++) /*只需遍历一半*/ swap(&arr[i], &arr[iend-i]); /*利用下标的特点进行交换*/ } /*第二种版本*/ void reverse2(int arr[], int len) { int i = 0, j = len - 1; while(i < j) { swap(&arr[i], &arr[j]); i++; j--; } }
注意,以上两个版本是不一样的。for循环一般用于可以事先确定循环范围的场合,这样带来了三个好处:一是有利于数据高速缓存,二是代码更短指令可预测,三是有利于并行;而while一般不事先界定范围,故无此特点。所以以上第一个版本从程序优化上来说应该更快一些。
浙公网安备 33010602011771号