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

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];

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值