PHP,是英文超文本预处理语言Hypertext Preprocessor的缩写。PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛地运用,以下是应届毕业生小编给大家整理提供的相关面试试题,快来阅读看看吧。
php算法题 (共12题)
(1)有一串数字1,2,3,4,5,6,组成一个随机数组,并且第3个位置不能为5,然后5,6不能连续。。
(2)一个字符串$str="aaaabsfdsfavdchjs",找出第一个唯一存在的字符。
(3)有一堆数字,12,65,110,2,3,55,79,10,45等很多数字并且没有重复的,
要求是:输出第一个数是最大的,第二个数是最小的 ,第三个数是第二大,
第四个数是第二小...一次类推
(4)写一个函数,将一个字符串(如:1234567890),转换成(如1,234,567,890)每3位用逗号隔开的形式。
(5)请写一个函数实现获取文件的后缀名 比如: abc.exe.jpg
(6)使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组
(7)写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数
(9)给出一个字符串如 “A journey of a thousand miles must begin with a single step.” ,通过 PHP 程序处理变成 “a journeY oF A thousanD mileS musT begiN witH A singlE steP.”
[
注意:
1、每个单词最后的字符如果是大写就变成小写,如果是小写就变成大写。
2、如果单词只有一个字母,则转换这个字母,如“A” 变成 “a”,“a”变成“A”。
3、标点符号不用变化。
]
1.将字符串转换成小写
strtolower():
2.将字符转成大写
strtoupper():
3.将字符串首字符转换成大写
usfilst():
4.将字符串每个单词的首字符转换成大写
ucwords():
所有字母变大写:strtoupper()
所有字母变小写:strtolower()
(10)请实现一个函数,输入一段文本,把文本解析到一个数组中,数组每行元素的key通过输入参数指定。函数原型:function ExplodeLines($text, $columnNames)
(11)写个function,把数组$data=array(23,22,45,28); 的个位,十位分别拆分成如下新数组$data=array(2,3,2,2,4,5,2,8);
(12)含折扣的退货算法。
函数原型: function CalcRefundAmount($orderItems, $discountAmount, $refundItems)
假设用户有一个订单,
$orderItems = array(
‘ItemA’=>array(‘price’=>5.0, ‘quantity’=>2),
‘ItemB’=>array(‘price’=>20.0, ‘quantity’=>1),
);
订单中产品ItemA的单价是5.0,数量是2;产品ItemB的单价是20,数量是1;
这个订单总价是 5.0 * 2 + 20.0 * 1 = 30。
假设最终付款的时候,由于这个订单由于使用代金券,优惠了$discountAmount = 10.0 元的价格,用户实际支付了20元。退货的时候,每个产品的退货价格是按照付款折扣率计算的。如果用户退货需要退掉1个ItemA,那么实际退给用户的钱应该是
(5.0 * 1) * (20.0/30.0) = 3.33 元(精确到2位小数)
$refundItems是实际退货的数量。在$orderItems为上述取值,$discountAmount=10的时候
样例1:$refundItems = array( array(‘ItemA’=>1) ) 表示退1个ItemA,函数返回3.33
样例2:$refundItems = array( array(‘ItemA’=>2, ‘ItemB’=>1) ) 表示全退,函数返回20.00
请编写能实现上述功能的函数。
第一题答案
//冒泡算法
/*冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1 个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将小数放前,大数放后,一直比较到最小数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。如此下去,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复 9,8,…,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,…,9,对于每一个i, j的值依次为1,2,…10-i。 */
$arr = array(345,4,17,6,52,16,58,69,32,8,234);
for($i=1;$i
for($j=count($arr)-1;$j>=$i;$j--){
if($arr[$j]<$arr[$j-1]){
$temp = $arr[$j-1];
$arr[$j-1] = $arr[$j];
$arr[$j] = $temp;
}
}
}
print_r($arr);
//生成随机数组
// $arr1 = array();
// for($k=0;$k<6;$k++)
// {
// $g = rand(1,6);
// while( in_array($g,$arr1) )
// {
// $g = rand(1,6);
// }
// $arr1[$k] = $g;
// }
$arr1 = array(1,2,3,4,5,6);
shuffle($arr1); //将数组随机排序
//利用冒泡算法实现第3个位置不能为5,然后5,6不能连续
for($n=1;$n
{
for($m=count($arr1)-1;$m>=$n;$m--)
{
if($arr1[$m] ==5)
{
if($arr1[$m-1] == 6)
{
if($m == 1)
{
$a = $arr1[$m+2];
$arr1[$m+2] = $arr1[$m-1] ;
$arr1[$m-1] = $a;
}
else
{
$a = $arr1[$m-2];
$arr1[$m-2] = $arr1[$m-1] ;
$arr1[$m-1] = $a;
}
}
}
if($arr1[$m] ==6)
{
if($arr1[$m-1] == 5)
{
if($m==1)
{
$a = $arr1[$m+2];
$arr1[$m+2] = $arr1[$m-1] ;
$arr1[$m-1] = $a;
}
else
{
$a = $arr1[$m-2];
$arr1[$m-2] = $arr1[$m-1] ;
$arr1[$m-1] = $a;
}
}
}
if($arr1[2] == 5)
{
$c = $arr1[3];
$arr1[3] = $arr1[2];
$arr1[2] = $c;
}
}
}
print_r($arr1);
第二题答案
/*str_split() 函数把字符串分割到数组中。
语法 str_split(string,length);
string 必需。规定要分割的字符串。
length 可选。规定每个数组元素的长度。默认是 1。
array_count_values() 函数用于统计数组中所有值出现的次数。
本函数返回一个数组,其元素的键名是原数组的值,键值是该值在原数组中出现的次数。
语法 array_count_values(array);
array 必需。规定输入的数组。
$a=array("Cat","Dog","Horse","Dog");
print_r(array_count_values($a));
?>
输出:Array ( [Cat] => 1 [Dog] => 2 [Horse] => 1 )
array_search() 函数与 in_array() 一样,在数组中查找一个键值。
语法 array_search(value,array,strict)
value 必需。规定在数组中搜索的值。
array 必需。被搜索的数组。
strict 可选。可能的值: true false - 默认
如果值设置为 true,还将在数组中检查给定值的类型。
$a=array("a"=>"Dog","b"=>"Cat","c"=>"Horse");
echo array_search("Dog",$a);
?>
输出:a*/
$str = "aaaabsfdsfavdchjs";
$arr = str_split($str);
$c = array_count_values($arr);
echo array_search('1', $c);
第三题答案
$testarr= array(12,65,110,2,3,55,79,10,45,200);
sort($testarr); //sort() 函数按升序对给定数组的值排序。
$count=0;
$issingle = count($testarr) % 2 ;
foreach($testarr as $key => $value ){
$result[] = $testarr[count($testarr)-1-$count];
if($issingle && $count+1 > ceil(count($testarr)/2)-1)break; //ceil() 函数向上舍入为最接近的整数
$result[] = $testarr[$count];
$count++;
if(!$issingle && $count+1 > ceil(count($testarr)/2))break;
}
print_r($result);
第四题答案
/*number_format() 函数通过千位分组来格式化数字。
语法number_format(number,decimals,decimalpoint,separator)
number 必需。要格式化的数字。
如果未设置其他参数,则数字会被格式化为不带小数点且以逗号 (,) 作为分隔符。
decimals 可选。规定多少个小数。如果设置了该参数,则使用点号 (.) 作为小数点来格式化数字。
decimalpoint 可选。规定用作小数点的字符串。
separator 可选。规定用作千位分隔符的字符串。仅使用该参数的第一个字符。比如 "xyz" 仅输出 "x"。
注释:如果设置了该参数,那么所有其他参数都是必需的。
echo number_format("1000000");
echo number_format("1000000",2);
echo number_format("1000000",2,",",".");
?>
输出:
1,000,000
1,000,000.00
1.000.000,00*/
echo number_format('1234567890'),"
";
第五题答案
/*
explode() 函数把字符串分割为数组。
语法explode(separator,string,limit)
separator 必需。规定在哪里分割字符串。
string 必需。要分割的字符串。
limit 可选。规定所返回的数组元素的最大数目。
$str = "Hello world. It's a beautiful day.";
print_r (explode(" ",$str));
?>
输出:
Array
(
[0] => Hello
[1] => world.
[2] => It's
[3] => a
[4] => beautiful
[5] => day.
)
*/
$file_name = "abc.exe.jpg";
function extend_3($file_name)
{
$extend =explode("." , $file_name);
$va=count($extend)-1;
return '.'.$extend[$va];
}
echo extend_3($file_name);
第六题答案
//冒泡算法
/*冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1 个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再大于第2个数),将小数放前,大数放后,一直比较到最小数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最小数。如此下去,直至最终完成排序。
由于在排序过程中总是小数往前放,大数往后放,相当于气泡往上升,所以称作冒泡排序。
用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复 9,8,…,1次。每次进行比较的两个元素都是与内循环j有关的,它们可以分别用a[j]和a[j+1]标识,i的值依次为1,2,…,9,对于每一个i, j的值依次为1,2,…10-i。 */
$arr = array(345,4,17,6,52,16,58,69,32,8,234);
for($i=1;$i
for($j=count($arr)-1;$j>=$i;$j--){
if($arr[$j]<$arr[$j-1]){
$temp = $arr[$j-1];
$arr[$j-1] = $arr[$j];
$arr[$j] = $temp;
}
}
}
print_r($arr);
/*
array_merge() 函数把两个或多个数组合并为一个数组。
array_merge(array1,array2,array3...)
$a1=array("a"=>"Horse","b"=>"Dog");
$a2=array("c"=>"Cow","b"=>"Cat");
print_r(array_merge($a1,$a2));
?>
输出Array ( [a] => Horse [b] => Cat [c] => Cow )
如果键名有重复,该键的键值为最后一个键名对应的值(后面的覆盖前面的)。如果数组是数字索引的,则键名会以连续方式重新索引。*/
//快速排序法
function quicksort($str){
if(count($str)<=1) return $str;//如果个数不大于一,直接返回
$key=$str[0];//取一个值,稍后用来比较;
$left_arr=array();
$right_arr=array();
for($i=1;$i
if($str[$i]<=$key)
$left_arr[]=$str[$i];
else
$right_arr[]=$str[$i];
}
$left_arr=quicksort($left_arr);//进行递归;
$right_arr=quicksort($right_arr);
return array_merge($left_arr,array($key),$right_arr);//将左中右的值合并成一个数组;
}//以下是测试
$str=array(5,3,8,2,5,9,7,2,1,4,0);
print_r(quicksort($str));
第七题答案
//二维数组排序,
//$source_array是数据,
//$key_word是排序的健值,
//$order是排序规则:0是升序,1是降序
function array_sort($source_array, $key_word, $order=0)
{
if (!is_array($source_array))
return false;
$keysvalue = array();
foreach($source_array as $key => $val)
{
$keysvalue[$key] = $val[$key_word];
}
if($order == 0)
{
asort($keysvalue);
}
else
{
arsort($keysvalue);
}
reset($keysvalue);
foreach($keysvalue as $key => $vals)
{
$keysort[$key] = $key;
}
$new_array = array();
foreach($keysort as $key => $val)
{
$new_array[$key] = $source_array[$val];
}
return $new_array;
}
$source_array = array(31=>array('id'=>10001, 'name'=>'allen'),
7=>array('id'=>10020, 'name'=>'bbb'),
13=>array('id'=>10013, 'name'=>'fff'),
45=>array('id'=>10024, 'name'=>'dddd'),
65=>array('id'=>10076, 'name'=>'gggg'),
12=>array('id'=>10047, 'name'=>'jjjj'),
23=>array('id'=>10058, 'name'=>'hhh'),
43=>array('id'=>10039, 'name'=>'kkkkk'),
56=>array('id'=>10011, 'name'=>'iiiiii'));
$result = array_sort($source_array, 'id', 0);
print_r($result);
?>