Careercup

2014-05-01 01:23

题目链接

原题:

WAP to modify the array such that arr[I] = arr[arr[I]]. 
Do this in place i.e. with out using additional memory. 

example : if a = {2,3,1,0} 
o/p = a = {1,0,3,2} 

Note : The array contains 0 to n-1 integers.

题目:给定一个长度为n的数组,由0至n - 1的排列组成。请做这样的变换,arr[i] = arr[arr[i]]。要求就地完成,不用额外数组。

解法:当数据范围有明确限制时,能够通过压缩维度来节省空间。对于一个数对(x, y),如果x和y都属于[0, n - 1],那么x * n + y就能唯一表示这个数对了。因此,可以先把变换后的结果存在高位上,然后再把高位的数通过除法移动到低位。算法是线性的,能够就地完成。

代码:

 1 // http://www.careercup.com/question?id=4909367207919616
 2 #include <cstdio>
 3 #include <vector>
 4 using namespace std;
 5 
 6 void displaceInPlace(vector<int> &v)
 7 {
 8     int i;
 9     int n;
10     
11     // all elements in the array has value between 0 and n - 1.
12     n = (int)v.size();
13     for (i = 0; i < n; ++i) {
14         v[i] = v[v[i]] % n * n + v[i];
15     }
16     for (i = 0; i < n; ++i) {
17         v[i] = v[i] / n;
18     }
19 }
20 
21 int main()
22 {
23     int i, n;
24     vector<int> v;
25     
26     while (scanf("%d", &n) ==  1 && n > 0) {
27         v.resize(n);
28         for (i = 0; i < n; ++i) {
29             scanf("%d", &v[i]);
30         }
31         displaceInPlace(v);
32         for (i = 0; i < n; ++i) {
33             printf((i ? " %d" : "%d"), v[i]);
34         }
35         putchar('
');
36         v.clear();
37     }
38     
39     return 0;
40 }
原文地址:https://www.cnblogs.com/zhuli19901106/p/3702453.html