一个算法问题,求高手来答 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
leassy
V2EX    程序员

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

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

    一个数组,如 数组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
    feeeei
        15
    feeeei  
       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($rr, 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     Solana     4007 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 05:28 PVG 13:28 LAX 21:28 JFK 00:28
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86