• 请不要在回答技术问题时复制粘贴 AI 生成的内容
leassy
V2EX  ›  程序员

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

  •  
  •   leassy · Mar 5, 2015 · 4886 views
    This topic created in 4265 days ago, the information mentioned may be changed or developed.

    一个数组,如 数组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 replies  •  2015-03-06 15:22:04 +08:00
    virusdefender
    virusdefender
    Mar 5, 2015❤️1
    1
    python的 简单一写 有bug自己再找吧

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

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

    virusdefender
    virusdefender
    Mar 5, 2015
    10
    @ryd994 额 您详细的说一下 没看懂~
    blacktulip
    blacktulip
    Mar 5, 2015
    11
    9楼稍加两个判断即可奇偶都有效,懒得改了,楼主自己弄吧
    CHEATBEATER
    CHEATBEATER
    Mar 5, 2015❤️1
    12
    #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
    CHEATBEATER
    Mar 5, 2015❤️2
    13
    lk09364
    lk09364
    Mar 5, 2015
    14
    没有正式学习过算法什么的…… 有错的话还请各位帮忙提点一下。
    https://gist.github.com/applelam/a8e81ca4e40a5b8ea10c
    feeeei
    feeeei
    Mar 6, 2015❤️1
    15
    刚开始自学Python没多久,感觉自己的是还是比较简洁的
    cchange
    cchange
    Mar 6, 2015
    16
    @CHEATBEATER 这个是什么编辑器呢?
    leassy
    leassy
    OP
    Mar 6, 2015
    17
    clanned
    clanned
    Mar 6, 2015
    18
    @cchange 应该是vi吧
    yuptyy
    yuptyy
    Mar 6, 2015❤️1
    19
    <?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
    Arrowing
    Mar 6, 2015
    20
    分页的话当然要用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
    Arrowing
    Mar 6, 2015❤️1
    21
    恢复可以用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
    sefemp
    Mar 6, 2015
    22
    不明觉厉啊
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1687 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 68ms · UTC 11:20 · PVG 19:20 · LAX 03:20 · JFK 06:20
    ♥ Do have faith in what you're doing.