您的位置:首页 > 其它

网上搜集到的exoweb的一些算法题

2009-09-18 16:58 246 查看
1、定义一个数组中,若某个值出现的次数在一半以上,则为执行者。如下数组:

A[8]={1,2,2,4,2,4,2,2} 由于2出现上午次数5次大于5/8>0.5,
所以2为数组A[8]的执行者。

要求:求出数组的执行者,与其对应的下标。
你需要用到的函数: int administer( int *s,int length)

我的答案:

首先,对于该函数定义持有疑问,传入参数s难道可以作为返回值的组成部分?而返回值int型,只可以指明admin是谁把?

php版本代码如下:

function administer(array $int_arr){

# 以数组中的值为key,出现的位置为值数组,形成hash表

$hash_arr = array();

foreach($int_arr as $ind=>$val){

$hash_arr[$val][] = $ind;

}

# 依次检查hash表中,元素出现的个数

$arr_length = count($int_arr);

foreach($hash_arr as $val=>$ind_arr){

$c = count($ind_arr);

if ($c > 0.5 * $arr_length){

return array($val=>$hash_arr[$val]);

}

}

return false;

}

版本二:

function administer(array $int_arr){

# 计算每个数字出现的次数

$num_arr = array();

foreach($int_arr as $val){

$num_arr[$val]++;

}

# 找到第一个执行者

$admin_val = false;

$arr_length = count($int_arr);

forach($num_arr as $val=>$num){

if ($num > 0.5 * $arr_length){

$admin_val = $val;

break;

}

}

# 如果找不到

if (false === $admin_val){

return false;

}

# 找执行者的index

$admin_idx = array();

foreach($int_arr as $ind=>$val){

if ($val == $amdin_idx){

$admin_idx[] = $ind;

}

}

return array($admin_val=>$admin_idx);

}

以上两个版本的时间复杂度都是n。由于php的hash数组很方便,所以实现起来也很方便。

2、米粒和国际象棋棋盘问题

问题如下,是Exoweb的一道面试题:
在国际象棋的棋盘上面有 NxN个格。每个格里面有若干的米粒。一只小猪站在1x1的格里,小猪每次只能向高位的列或行移动。小猪会吃掉所经过的格子里面所有的米粒。请编写程序计算小猪能吃掉的米粒的最大值

解答:

这个问题相当于,以格子里的米粒数为权重,求左下角格子到右上角格子的最长路径。

3、实现一个去除整型数组中绝对值相同的数字.最后返回一个长度

function filter_array(&$arr){

if (empty($arr)){

return 0;

}

$ret = array();

foreach($arr as $v){

if ($v < 0){

$v = -$v;

}

if (!in_array($v, $ret)){
$ret[] = $v;

}

}

$arr = $ret;

return count($arr);

}

4、实现一个整型数组类似java.lang.String的charAt方法

该题目估计面试者描述的不是很清楚,揣摩他的意思,或者是实现一个方法,返回字符串中第几个字符?但是这样的话,整形数组又是什么呢?

解答:

char charAt(char * str, int index){

int len = length(str);

if (index < 0 || index > len){

return NULL;

}

return str[index];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: