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