最近在参加一些面试,总结一些面试题
题一
字符串 ‘abbcccddddeef’ 输出成 a1b2c3d4e2f1 字符串计数
我的做法:把字符串用str_split($str,1) 转换成数组 然后键与值互换 array_flip函数 通过两个循环进行字母的比对记录个数
$str = 'abbcccddddeef';
getData($str);
function getData($str) {
$arr = str_split($str,1);
$data = array_flip($arr);
// print_r($data);
// die;
foreach ($data as $k => $v) {
$data[$k] = 0;
foreach ($arr as $key => $value) {
if ($k==$value) {
$data[$k]++;
}
}
}
var_dump($data);
}
die;
/*结果:array (size=6)
'a' => int 1
'b' => int 2
'c' => int 3
'd' => int 4
'e' => int 2
'f' => int 1
*/
通过在网上查一些方法的到一个最简便的方法看完这个方法后我发现自己就是个傻子。
php提供了array_count_values()函数用于统计数组中所有值出现的次数。本函数返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数。
最佳做法:
$str = 'abbcccddddeef';
$arr = str_split($str);
$res = array_count_values($arr);
var_dump($res);die;
/*结果:array (size=6)
'a' => int 1
'b' => int 2
'c' => int 3
'd' => int 4
'e' => int 2
'f' => int 1
*/
题二
二维数组字段的排序 优先id 若id 相同用data排序
$arr = array(
array('id'=>1,'data'=>'a'),
array('id'=>3,'data'=>'c'),
array('id'=>2,'data'=>'b'),
array('id'=>2,'data'=>'a')
);
$id = $data = array();
foreach($arr as $key => $value){
$id[$key] = $value['id'];
$data[$key] = $value['data'];
}
array_multisort($id, SORT_ASC, $data, SORT_DESC, $arr);
print_r($arr);
die;
题三
数字字母转换
1=>A 2=>B 3=>C…Z=>26 +=>‘ ’(空格)
eg:
numbersToLetters(‘20 5 19 20+4 15 13 5’); 输出 TEST DOME
分析: A字母是ascii码65开始的 a字母是97 将数字1转换为A的过程用到两个函数strtoupper(chr(
v
a
l
u
e
+
64
)
)
c
h
r
函
数
从
指
定
的
A
S
C
I
I
值
返
回
字
符
对
应
的
o
r
d
(
)
函
数
返
回
字
符
串
的
首
个
字
符
的
A
S
C
I
I
值
。
s
t
r
t
o
u
p
p
e
r
(
)
函
数
把
字
符
串
转
换
为
大
写
。
加
这
个
函
数
是
为
了
双
保
险
c
h
r
(
value+64)) chr 函数从指定的 ASCII 值返回字符 对应的 ord() 函数返回字符串的首个字符的 ASCII 值。 strtoupper() 函数把字符串转换为大写。 加这个函数是为了双保险chr(
value+64))chr函数从指定的ASCII值返回字符对应的ord()函数返回字符串的首个字符的ASCII值。strtoupper()函数把字符串转换为大写。加这个函数是为了双保险chr(value+64)已经是大写了 对应的strtolower() 函数把字符串转换为小写。
要注意 20+4 中间没有空格所以要在转成数组
class NumbersToText
{
public static function numbersToLetters($string)
{
try {
$arr = explode(' ',$string);
$str = '';
// print_r($arr);die;
foreach ($arr as $key => $value) {
if (is_numeric($value)) {
$str .= strtoupper(chr($value+64));
} else {
$arrT = explode('+',$value);
$str .= strtoupper(chr($arrT[0]+64)).' '.strtoupper(chr($arrT[0]+64));
}
}
return $str;
} catch (\Exception $e) {
echo "error";
}
}
}
echo NumbersToText::numbersToLetters('20 5 19 20+4 15 13 5');
die;