算法游戏
排序算法:随机法 分治法 贪心法
http://www.cnblogs.com/kkun/archive/2011/11/23/2260312.html
插入排序(根据元素找位置) 冒泡排序(两两比较) 快速排序 (中位数) 选择排序(根据位置找元素)堆排序(左平衡二叉树) 桶排序(key是值 value是个数,循环获取)
归并算法排序(两两分成单个元素拼合成有序集) 基数排序(按位比较) 计数排序(统计元素个数,次第相加,由索引排位) 希尔排序(按照固定间隔取数,分成多个小组,然后合并,最后间隔必须是1) ------------------------------------------------------------------------------------------- 查找算法:二分查找、顺序查找|循序搜寻法、插捕搜寻法(分布平均的数组高效) 其它算法:牛年求牛 分苹果 猴子代王 | 菱形 杨辉三角 | 斐波那契数列、线性表删除、汉诺塔算法 哈希算法:简单哈希 一致性哈希 拉链法哈希
字符处理:数据切分,出现次数,排列组合,数据组合 破解密码 字符相似 +数字转成汉字
内置函数:合并数组 字符查找 字符长度 字符翻转 字符删除/插入/截取 字符比较 字符复制 字符连接 字符编码解码/加密解密 字符替换 截取
*/
一.使用:牛年求牛 分苹果 猴子代王 | 菱形 杨辉三角 | 斐波那契 线性表删除
//2.牛年求牛:有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛
[php] view plaincopy
//静态变量,循环中数值不变 | 递归是在判断内实现的 |区分年份和数目
function niunum($n) {
static $num = 1;
for ($i = 1; $i <= $n; $i++) {
if ($i >= 4 && $i < 15) { //生育期才计算
$num++;
niunum($n - $i); //抛去计算了生育期的牛
}
if ($i == 20) $num--;
}
return $num;
}
echo niunum(10);
2. 有5个人偷了一堆苹果,准备在第二天分赃。晚上,有一人遛出来,把所有菜果分成5份,但是多了一个,顺手把这个扔给树上的猴了,自己先拿1/5藏了。
没想到其他四人也都是这么想的,都如第一个人一样分成5份把多的那一个扔给了猴,偷走了1/5。
第二天,大家分赃,也是分成5份多一个扔给猴了。最后一人分了一份。问:共有多少苹果?
for($i=0;;$i++){
if($i%5 == 1){
$t = $i- round($i/5) -1;
if($t%5 ==1){
$s = $t - round($t/5) -1;
if($s%5 == 1){
$x = $s-round($s/5) -1;
if($x % 5 ==1){
$o = $x - round($x/5) -1;
if($o % 5 ==1){
$la = $o - round($o/5) -1;
if($la % 5 ==1){
echo $i;
break;
}
}
}
}
}
}
}
3.一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,
如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。
function king($n,$m) {
$monkeys = range(1,$n);
$i = 0;
while(count($monkeys) > 1) { //每个循环要算一回
if(($i+1)%$m == 0) { //与monkey共用的$i,所以要加1,保持monkey的索引i是从1开始的
unset($monkeys[$i]);
} else {
//不是,放尾部,从下一个开始循环,被踢的猴子会消失,等于位子没有变化,就是排序了
array_push($monkeys,$monkeys[$i]);
unset($monkeys[$i]);
}
$i++;
}
//获取当前猴子的位子
return current($monkeys);
}
$king = king(100,7);
print_r($king);
4. 用符号*画一个菱形图案.
for($i=0;$i<4;$i++){ //行数
for($j=0;$j<3-$i;$j++){ //空格数
echo " ";
}
for($k=0;$k<$i+1;$k++){ //星星数
echo "* ";
}
echo "<br/>";
}
for($i=0;$i<3;$i++){
for($j=0;$j<$i+1;$j++){
echo " ";
}
for($k=0;$k<3-$i;$k++){
echo "* ";
}
echo "<br/>";
}
//6.杨辉三角
[php] view plaincopy
$n=10;
for($i=0;$i<$n;$i++){ //行
for($k=$n;$k>$i;$k--){ //由多到少,递减,--
echo " ";
}
for($j=0;$j<=$i;$j++){//列
if($j==0||$i==$j){ //两边都是 1
$arr[$i][$j]=1;
}else {
$arr[$i][$j]=$arr[$i-1][$j]+$arr[$i-1][$j-1];//上一行的两个相邻数据相加算数
}
echo $arr[$i][$j]." ";
}
echo "<br>";
}
//6.实现斐波那契数列,格式为:1,1,2,3,5,8…即当前数字为前两个数字之和.
function feibolaqi($num) {
$arr = array();
for($i=0;$i<=$num;$i++) {
if($i == 1 || $i == 2) {
$arr[$i-1] = 1;
} else {
$arr[$i-1] = $arr[$i-2] + $arr[$i-3];
}
}
return $arr;
}
var_dump(feibolaqi(10));
//线性表的删除(数组中实现)
function delete_array_element($array, $i) {
$len = count($array);
for ($j=$i; $j<$len; $j++){ //直接从要找的点开始了
@$array[$j] = $array[$j+1];
}
array_pop($array); //删除最后空元素
return $array;
}
print_r(delete_array_element(array(1,2,3,4,5), 2));
*
*
*/
/*
三.数组转化:数据切分,出现次数,排列组合,数据组合 +字符相似 用户密码 数字转成汉字
//8.把数组array(12,34,56,32) 转化为 array(1,2,3,4,5,6,3,2)
function changeArr($arr) {
return str_split(implode("", $arr),1); //str_split(str,num);
}
print_r(changeArr(array(12,34,56,32)));
//已知字符串 $string = "2dsjfh87HHfytasjdfldiuuidhfcjh";找出 $string 中出现次数最多的所有字符。
//1
$string = "2dsjfh87HHfytasjdfldiuuidhfcjh";
$b = array_count_values(str_split($string)); //array_count_values
print_r(array_keys($b, max($b)));
//2 暂时忽略
$re = count_chars($string, 1);
print_r(array_map("chr", array_keys($re, max($re))));
echo "<br />";
1. 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
<?php
$num = 0;
for($i=1;$i<=4;$i++){
for($j=1;$j<=4;$j++){
for($k=1;$k<=4;$k++){
if($i!=$j && $i!=$k && $k!=$j) //!=
$num++;
echo $i.$j.$k."<br>";
}
}
}
- 上一篇:没有了
- 下一篇:没有了