zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    大话算法-排序-希尔排序
    Linux三剑客-awk
    Linux三剑客-sed
    大话算法-排序-冒泡排序
    大话算法-排序-选择排序
    删除Win10菜单中的幽灵菜单(ms-resource:AppName/Text )
    微信推送模板消息
    获取当前域名的根域
    MVC 全站开启缓存,缓解服务器的请求压力
    MVC 开启gzip压缩
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3702453.html
Copyright © 2011-2022 走看看