网上搜集到的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];
}
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];
}
相关文章推荐
- 从协议网上搜集的SMTP协议的一些资料以及命令
- 网上搜集整理的一些java基础面试题
- 从协议网上搜集的SMTP协议的一些资料以及命令
- js 在网上找了一些加密的方法 (所有代码来的web)
- 一些常用的算法笔记(烂笔头,不断学习、搜集更新...)
- 在网上搜集到了一些安装QQ在ubuntu上的方法,好用,亲自试过
- 网上搜集的storm 一些有用的资料
- 编译一些网上的directshow的例子时候,总会遇到各种各样的问题,下面搜集如下:
- 网上搜集的一些applet的应用展示
- 网上搜集的一些FLEX面试题
- DLL和LIB的一些知识点(网上搜集)
- Java 编码相关的一些文章 从网上搜集的还可以的
- 转载:算法方面的一些书籍和网上资源
- 网上搜集了点资料,学web的人互相分享共同进步吧(php编码的好习惯必须养成)
- MyEclipse6.5优化的一些方法(网上搜集加自己整理)
- 对垃圾搜集算法的一些理解:标记-清楚算法、复制法、垃圾生命周期划分
- 算法方面的一些书籍和网上资源
- 从网上搜集的一些eclipse相关快捷键
- 网上一些《算法(第四版)》习题答案链接
- 从网上搜集的一些eclipse相关快捷键