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

2015-03-05 15:48:17 +08:00
 leassy

一个数组,如 数组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

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

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

3756 次点击
所在节点    程序员
22 条回复
virusdefender
2015-03-05 16:20:48 +08:00
python的 简单一写 有bug自己再找吧

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

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

virusdefender
2015-03-05 18:32:22 +08:00
@ryd994 额 您详细的说一下 没看懂~
blacktulip
2015-03-05 18:34:32 +08:00
9楼稍加两个判断即可奇偶都有效,懒得改了,楼主自己弄吧
CHEATBEATER
2015-03-05 18:46:31 +08:00
#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
2015-03-05 19:21:30 +08:00
lk09364
2015-03-05 20:32:44 +08:00
没有正式学习过算法什么的…… 有错的话还请各位帮忙提点一下。
https://gist.github.com/applelam/a8e81ca4e40a5b8ea10c
MiniGhost
2015-03-06 00:19:04 +08:00
刚开始自学Python没多久,感觉自己的是还是比较简洁的
cchange
2015-03-06 01:15:45 +08:00
@CHEATBEATER 这个是什么编辑器呢?
leassy
2015-03-06 08:56:44 +08:00
clanned
2015-03-06 09:31:09 +08:00
@cchange 应该是vi吧
yuptyy
2015-03-06 10:11:11 +08:00
<?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
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);

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/174692

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX