一个数组,如 数组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
意思就是说前面的元素数量不足,就在后面补足,后面的元素数量不足就在前面补足
不管什么语言都可以,谢谢
1
virusdefender 2015-03-05 16:20:48 +08:00 1
python的 简单一写 有bug自己再找吧
|
2
virusdefender 2015-03-05 16:23:19 +08:00 2
ps 这也敢叫算法
|
3
leassy OP @virusdefender 多谢,只是不想要太多IF,要很精简的
|
4
ryd994 2015-03-05 17:43:35 +08:00
|
5
phoeagon 2015-03-05 17:54:03 +08:00
這題意說得是啥。。。。
|
6
DaniloSam 2015-03-05 17:56:12 +08:00 via iPhone
感觉是本科作业啊
|
8
KentY 2015-03-05 18:24:16 +08:00
1,就是计算两个边界,和0和len(array)比较,然后返回俩边界内的元素
2,题目交代不清,你只说“前后平均”, 这不是个平均的概念,你应该强调等数目的与目标元素前后相邻连续元素,否则前后随机取元素,只要数目对了,就满足你要求 3, 这题要是在SO,一定downvote多多,下次别问这样的了 |
9
blacktulip 2015-03-05 18:28:28 +08:00 1
|
10
virusdefender 2015-03-05 18:32:22 +08:00
@ryd994 额 您详细的说一下 没看懂~
|
11
blacktulip 2015-03-05 18:34:32 +08:00
9楼稍加两个判断即可奇偶都有效,懒得改了,楼主自己弄吧
|
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; } // 如果是分页的话感觉要有问题, 毕竟要考虑最后一页,不过符合题主的样例 = = |
13
CHEATBEATER 2015-03-05 19:21:30 +08:00 2
|
14
lk09364 2015-03-05 20:32:44 +08:00
没有正式学习过算法什么的…… 有错的话还请各位帮忙提点一下。
https://gist.github.com/applelam/a8e81ca4e40a5b8ea10c |
15
MiniGhost 2015-03-06 00:19:04 +08:00 1
刚开始自学Python没多久,感觉自己的是还是比较简洁的
|
16
cchange 2015-03-06 01:15:45 +08:00
@CHEATBEATER 这个是什么编辑器呢?
|
17
leassy OP |
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)); |
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); |
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); ``` |
22
sefemp 2015-03-06 15:22:04 +08:00
不明觉厉啊
|