赞
踩
普通解法: 可以每次将数组中的元素右移一位,循环K次。每个元素右移N位后都会回到自己的位置上。因此,如果K > N,右移K-N之后的数组序列跟右移K位的结果是一样的。进而可得出一条通用的规律:右移K位之后的情形,跟右移K’= K % N位之后的情形一样。
高级解法(线性时间):假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位。比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把这两段看成两个整体。右移K位(即右移K = K % N位)的过程就是把数组的两部分交换一下。变换的过程通过以下步骤完成:
逆序排列abcd:abcd1234 → dcba1234;
逆序排列1234:dcba1234 → dcba4321;
全部逆序:dcba4321 → 1234abcd。
void reverse(NSMutableArray *arr, NSInteger lo, NSInteger hi)
{
for (NSInteger i = lo,j = hi; i
NSObject *num = arr[i];
arr[i] = arr[j];
arr[j] = num;
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSMutableArray *arr = [NSMutableArray arrayWithObjects:@(1),@(2),@(3),@(4),@(5),@(6), nil];
NSInteger k = 1;
k = k%arr.count;
if (k!=0) {
reverse(arr,0,arr.count-k-1);
reverse(arr,arr.count-k,arr.count-1);
reverse(arr, 0, arr.count-1);
}
NSLog(@"%@",arr);
}
return 0;
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。