V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
leassy
V2EX  ›  程序员

一个算法问题,求高手来答

  •  
  •   leassy · 2015-03-05 15:48:17 +08:00 · 3879 次点击
    这是一个创建于 3558 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一个数组,如 数组1:{1,2,3,4,5,6,7,8,9,10.....}
    有很多,或者只有很少几个 如数组2:{1,2,3,4}
    元素数量不定
    给出一个元数的位置,在数组中这个位置前后平均取出元素,数量不超过指定的X个

    如,给出位置是4,在数组中共取出最多5个,要求前后数量平均

    结果为:
    第一个数组: 2,3,4,5,6
    第二个数组是1,2,3,4

    给出位置是2,在数组中共取出最多5个,要求前后数量平均
    第一个数组: 1,2,3,4,5
    第二个数组是1,2,3,4

    意思就是说前面的元素数量不足,就在后面补足,后面的元素数量不足就在前面补足

    不管什么语言都可以,谢谢

    22 条回复    2015-03-06 15:22:04 +08:00
    virusdefender
        1
    virusdefender  
       2015-03-05 16:20:48 +08:00   ❤️ 1
    python的 简单一写 有bug自己再找吧

    virusdefender
        2
    virusdefender  
       2015-03-05 16:23:19 +08:00   ❤️ 2
    ps 这也敢叫算法
    leassy
        3
    leassy  
    OP
       2015-03-05 16:47:44 +08:00
    @virusdefender 多谢,只是不想要太多IF,要很精简的
    ryd994
        4
    ryd994  
       2015-03-05 17:43:35 +08:00
    @virusdefender len1,len2为什么不是直接+-,然后再计算越界,把越界的换到另一头?
    你这样slice的话会多几次拷贝的吧……

    @leassy 这属于智商题
    phoeagon
        5
    phoeagon  
       2015-03-05 17:54:03 +08:00
    這題意說得是啥。。。。
    DaniloSam
        6
    DaniloSam  
       2015-03-05 17:56:12 +08:00 via iPhone
    感觉是本科作业啊
    leassy
        7
    leassy  
    OP
       2015-03-05 17:58:41 +08:00
    @DaniloSam
    @phoeagon
    不是作业,就是一个简单的分页而已,我不想写代码,哈哈,贱不
    KentY
        8
    KentY  
       2015-03-05 18:24:16 +08:00
    1,就是计算两个边界,和0和len(array)比较,然后返回俩边界内的元素
    2,题目交代不清,你只说“前后平均”, 这不是个平均的概念,你应该强调等数目的与目标元素前后相邻连续元素,否则前后随机取元素,只要数目对了,就满足你要求
    3, 这题要是在SO,一定downvote多多,下次别问这样的了
    blacktulip
        9
    blacktulip  
       2015-03-05 18:28:28 +08:00   ❤️ 1
    贱。早说是分页
    以下代码仅当 spread 为奇数是有效,Ruby

    virusdefender
        10
    virusdefender  
       2015-03-05 18:32:22 +08:00
    @ryd994 额 您详细的说一下 没看懂~
    blacktulip
        11
    blacktulip  
       2015-03-05 18:34:32 +08:00
    9楼稍加两个判断即可奇偶都有效,懒得改了,楼主自己弄吧
    CHEATBEATER
        12
    CHEATBEATER  
       2015-03-05 18:46:31 +08:00   ❤️ 1
    #include <cstdio>

    int num[1000];

    int main() {
    int tot;
    while (scanf("%d", &tot) != EOF) {
    for (int i = 1; i <= tot; i++)
    scanf("%d", num+i);
    int pos, out;
    scanf("%d%d", &pos, &out);
    int L = pos - (out-1)/2, R = pos + (out-1)/2;
    if (L < 1) R += (out-1)/2 - pos + 1;
    if (R > tot) L -= (out-1)/2 + pos - tot;
    L = L > 1 ? L : 1;
    R = R < tot ? R : tot;
    for (int i = L; i <= R; i++) {
    printf("%d", num[i]);
    if (i != R) putchar(' ');
    }
    puts("");
    }
    return 0;
    }
    // 如果是分页的话感觉要有问题, 毕竟要考虑最后一页,不过符合题主的样例 = =
    CHEATBEATER
        13
    CHEATBEATER  
       2015-03-05 19:21:30 +08:00   ❤️ 2
    lk09364
        14
    lk09364  
       2015-03-05 20:32:44 +08:00
    没有正式学习过算法什么的…… 有错的话还请各位帮忙提点一下。
    https://gist.github.com/applelam/a8e81ca4e40a5b8ea10c
    MiniGhost
        15
    MiniGhost  
       2015-03-06 00:19:04 +08:00   ❤️ 1
    刚开始自学Python没多久,感觉自己的是还是比较简洁的
    cchange
        16
    cchange  
       2015-03-06 01:15:45 +08:00
    @CHEATBEATER 这个是什么编辑器呢?
    leassy
        17
    leassy  
    OP
       2015-03-06 08:56:44 +08:00
    clanned
        18
    clanned  
       2015-03-06 09:31:09 +08:00
    @cchange 应该是vi吧
    yuptyy
        19
    yuptyy  
       2015-03-06 10:11:11 +08:00   ❤️ 1
    <?php
    $arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

    function get($arr, $which, $num) {
    $index = array_search($which, $arr); //所在key
    $before = floor(($num - 1) / 2); //前取得数目
    $after = ceil(($num - 1) / 2); //后面取得数目
    $count = count($arr); //总容量

    if($num >= $count) {
    return $arr;
    }
    if($before > $index) {
    return array_slice($arr, 0, $num);
    }
    elseif(($index + $after) >= $count) {
    return array_slice($arr, -$num);
    }
    else
    return array_slice($arr, $index - $before, $num);
    }

    print_r(get($arr1, 6, 5));
    Arrowing
        20
    Arrowing  
       2015-03-06 11:37:31 +08:00
    分页的话当然要用javascript啦~
    改了下我在angularjs里面写的
    测试不够,有bug望谅解

    /* 生成一个分页数组,以from开始,num个元素 */
    function getArrOfNum(num, from) {
    from = from || 1;

    var arr = new Array(num),
    i = from,
    len = arr.length + from;

    for (; i < len; i++) {
    arr[i - from] = i;
    };

    return arr;
    }

    /* 当页数改变时,适用于ajax分页 */
    function toPage(count/* 总页数 */, current/* 当前页*/, max/* 显示的最多页数 */) {
    var pages,//最后得到的分页元素
    from = current - Math.floor(max/2),//当前页的前面页数
    to = current + Math.floor(max/2) - 1;//当前页的后面页数

    if (count > max && from >= 1) {

    if (to <= count) {
    pages = getArrOfNum(max, from);
    } else {
    pages = getArrOfNum(max, from - (to - count));
    };

    } else { // 少于等于max页,直接返回
    pages = getArrOfNum(count > max ? max : count);
    };
    return pages;
    }
    toPage(15, 7, 5);
    Arrowing
        21
    Arrowing  
       2015-03-06 11:39:41 +08:00   ❤️ 1
    恢复可以用markdown么?

    ```javascript
    /* 生成一个分页数组,以from开始,num个元素 */
    function getArrOfNum(num, from) {
    from = from || 1;

    var arr = new Array(num),
    i = from,
    len = arr.length + from;

    for (; i < len; i++) {
    arr[i - from] = i;
    };

    return arr;
    }

    /* 当页数改变时,适用于ajax分页 */
    function toPage(count/* 总页数 */, current/* 当前页*/, max/* 显示的最多页数 */) {
    var pages,//最后得到的分页元素
    from = current - Math.floor(max/2),//当前页的前面页数
    to = current + Math.floor(max/2) - 1;//当前页的后面页数

    if (count > max && from >= 1) {

    if (to <= count) {
    pages = getArrOfNum(max, from);
    } else {
    pages = getArrOfNum(max, from - (to - count));
    };

    } else { // 少于等于max页,直接返回
    pages = getArrOfNum(count > max ? max : count);
    };
    return pages;
    }
    toPage(15, 7, 5);
    ```
    sefemp
        22
    sefemp  
       2015-03-06 15:22:04 +08:00
    不明觉厉啊
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2516 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:29 · PVG 10:29 · LAX 18:29 · JFK 21:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.