Careercup - Microsoft面试题 - 6282862240202752

本文介绍了一种高效的数组循环右移算法。首先通过取模处理边界情况,然后使用三次反转实现移位,确保了算法的高效性。适用于负数移位及移位次数大于数组长度的情况。

2014-05-11 03:56

题目链接

原题:

Given an integer array. Perform circular right shift by n. 
Give the best solution.

题目:给数组进行循环移位,给出最优解。

解法:首先要考虑n的范围,对于负数和超过数组长度的数,先进行取模操作。然后用三次反转数组就可以完成循环移位。

代码:

 1 // http://www.careercup.com/question?id=6282862240202752
 2 #include <algorithm>
 3 #include <iostream>
 4 #include <vector>
 5 using namespace std;
 6 
 7 void reverse(vector<int> &v, int ll, int rr)
 8 {
 9     int n = (int)v.size();
10     
11     if (ll > rr) {
12         swap(ll, rr);
13     }
14     if (ll < 0 || ll > n - 1 || rr < 0 || rr > n - 1) {
15         return;
16     }
17     while (ll < rr) {
18         swap(v[ll], v[rr]);
19         ++ll;
20         --rr;
21     }
22 }
23 
24 void rightShift(vector<int> &v, int k)
25 {
26     int n = (int)v.size();
27     
28     if (n == 0) {
29         return;
30     }
31     k = k >= 0 ? k % n : (n - (n - k) % n) % n;
32     if (k == 0) {
33         return;
34     }
35     reverse(v, 0, n - k - 1);
36     reverse(v, n - k, n - 1);
37     reverse(v, 0, n - 1);
38 }
39 
40 int main()
41 {
42     vector<int> v;
43     int n, k;
44     int i;
45     
46     while (cin >> n && n > 0) {
47         v.resize(n);
48         for (i = 0; i < n; ++i) {
49             cin >> v[i];
50         }
51         cin >> k;
52         rightShift(v, k);
53         for (i = 0; i < n; ++i) {
54             i ? (cout << ' '), 1 : 1;
55             cout << v[i];
56         }
57         cout << endl;
58         
59         v.clear();
60     }
61     
62     return 0;
63 }

 

转载于:https://www.cnblogs.com/zhuli19901106/p/3721323.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值