Skip to content

Commit 3ff2efc

Browse files
authored
Merge pull request #1 from PuShaoWei/master
merge
2 parents d6c94a0 + f81f5a2 commit 3ff2efc

15 files changed

+562
-400
lines changed

LICENSE

Lines changed: 21 additions & 376 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,28 @@
1717
1818
├──Package
1919
│ ├── Sort 排序篇
20-
│ │ ├── BubbleSort.php 冒泡排序
21-
│ │ ├── QuickSort.php 快速排序
22-
│ │ ├── ShellSort.php 希尔排序
23-
│ │ ├── MergeSort.php 归并排序
24-
│ │ ├── InsertSort.php 插入排序
25-
│ │ └── SelectSort.php 选择排序
20+
│ │ ├── BubbleSort.php 冒泡排序
21+
│ │ ├── QuickSort.php 快速排序
22+
│ │ ├── ShellSort.php 希尔排序
23+
│ │ ├── MergeSort.php 归并排序
24+
│ │ ├── InsertSort.php 插入排序
25+
│ │ └── SelectSort.php 选择排序
2626
│ │
27-
│ ├── Query 查询篇
28-
│ │ ├── BinaryQuery.php 二分查找
29-
│ │ └── QulickQuery.php 快速查找
27+
│ ├── Query 查找篇
28+
│ │ ├── BinaryQuery.php 二分查找
29+
│ │ ├── InseertQuery.php 插入查找
30+
│ │ ├── FibonacciQuery.php 斐波那契查找
31+
│ │ └── QulickQuery.php 快速查找
3032
│ │
3133
│ └── Other 其他
32-
│ ├── MonkeyKing.php 猴子选大王
33-
│ └── BigSmallReplace.php Hello World 输出 Olleh Dlrow
34+
│ ├── MonkeyKing.php 猴子选大王
35+
│ ├── DynamicProgramming.php 动态规划
36+
│ ├── Fibonacci.php 斐波那契数列
37+
│ ├── StealingApples.php 偷苹果求余
38+
│ ├── HanoiGames.php 汉诺塔游戏
39+
│ ├── GetCattle.php 牛年求牛
40+
│ ├── OnlyNumbers.php 求唯一数
41+
│ └── BigSmallReplace.php Hello World 输出 Olleh Dlrow
3442
3543
├──LICENSE
3644
└──README.md
@@ -108,6 +116,13 @@ return i;
108116
> #### 可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。
109117
一个算法所需的存储空间用f(n)表示。S(n)=O(f(n))  其中n为问题的规模,S(n)表示空间复杂度。
110118

119+
## 递归和循环的简单比较:
120+
1、从程序上看,递归表现为自己调用自己,循环则没有这样的形式。
121+
2、递归是从问题的最终目标出发,逐渐将复杂问题化为简单问题,并且简单的问题的解决思路和复杂问题一样,同时存在基准情况,就能最终求得问题,是逆向的。而循环是从简单问题出发,一步步的向前发展,最终求得问题,是正向的。
122+
3、任意循环都是可以用递归来表示的,但是想用循环来实现递归(除了单向递归和尾递归),都必须引入栈结构进行压栈出栈。
123+
4、一般来说,非递归的效率高于递归。而且递归函数调用是有开销的,递归的次数受堆栈大小的限制。
124+
125+
111126
## 一起进步学习
112127
1. Fork 我的项目
113128
2. Pull Request

package/Other/BigSmallReplace.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99
*
1010
* segmentFault: https://segmentfault.com/q/1010000010627229
1111
*
12-
* @language php
13-
* @author Pu Shaowei
1412
* @param $str
1513
* @return string
1614
*/

package/Other/ColorBricks.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
/**
3+
* ColorBricks 彩色砖块
4+
*
5+
* @author Pu ShaoWei <[email protected]>
6+
* @date 2017/9/1
7+
* @license MIT
8+
* -------------------------------------------------------------
9+
* 思路分析:额。。。 没做出来求大佬带
10+
* -------------------------------------------------------------
11+
* 小易有一些彩色的砖块。每种颜色由一个大写字母表示。各个颜色砖块看起来都完全一样。
12+
* 现在有一个给定的字符串s,s中每个字符代表小易的某个砖块的颜色。小易想把他所有的砖块排成一行。
13+
* 如果最多存在一对不同颜色的相邻砖块,那么这行砖块就很漂亮的。
14+
* -------------------------------------------------------------
15+
* 请你帮助小易计算有多少种方式将他所有砖块排成漂亮的一行。(如果两种方式所对应的砖块颜色序列是相同的,那么认为这两种方式是一样的。)
16+
* -------------------------------------------------------------
17+
* 例如: s = "ABAB",那么小易有六种排列的结果:
18+
* "AABB","ABAB","ABBA","BAAB","BABA","BBAA"
19+
* 其中只有"AABB"和"BBAA"满足最多只有一对不同颜色的相邻砖块。
20+
* -------
21+
* 输入描述:
22+
* 输入包括一个字符串s,字符串s的长度length(1 ≤ length ≤ 50), [s中的每一个字符都为一个大写字母(A到Z)]。
23+
* 输出描述:
24+
* 输出一个整数,表示小易可以有多少种方式。
25+
* -------
26+
* 输入例子1:
27+
* ABAB
28+
* 输出例子1:
29+
* 2
30+
* @param $inputting
31+
* @return mixed
32+
*/
33+
function ColorBricks($inputting)
34+
{
35+
$str = ord($inputting);
36+
$strLen = strlen($inputting);
37+
// if (!($str > 64 && $str < 91) ||
38+
// !(1 <= $strLen && $strLen <= 50)
39+
// ) {
40+
// return false;
41+
// }
42+
$group = [];
43+
$temp = '';
44+
45+
// 表示标排列 有24 种排列方式
46+
// 0123 0132 0213 0231 0312 0321
47+
// 1023 1032 1203 1230 1320 1302
48+
// 2013 2031 2130 2103 2301 2310
49+
// 3012 3021 3120 3102 3201 3210
50+
51+
// 0123 0132
52+
// 0213 0231
53+
// 0312 0321
54+
55+
// 额。。。 没做出来求大佬带
56+
57+
for ($i = 1; $i < $strLen; $i++) {
58+
// $group[$inputting] = true;
59+
for ($j = 1; $j < $strLen ; $j++) {
60+
echo $i, $j, PHP_EOL;
61+
if (isset($inputting[$i + 1])) {
62+
$temp = $inputting[$i];
63+
$inputting[$i] = $inputting[$i + 1];
64+
$inputting[$i + 1] = $temp;
65+
}
66+
}
67+
}
68+
var_dump($group);
69+
}
70+
71+
echo ColorBricks("AABB");

package/Other/DynamicProgramming.php

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
3+
/**
4+
* DynamicProgramming
5+
*
6+
* @author Pu ShaoWei <[email protected]>
7+
* @date 2017/8/28
8+
* @license Mozilla
9+
* -------------------------------------------------------------
10+
* 思路分析:动态规划原理思想,max(opt(i-1,w),wi+opt(i-1,w-wi)) 当中最大值,opt(i-1,w-wi)指上一个最优解
11+
* -------------------------------------------------------------
12+
* 一个承受最大重量为W的背包,现在有n个物品,每个物品重量为t, 每个物品的价值为v。
13+
* 要使得这个背包重量最大(但不能超过W),同时又需要背包的价值最大
14+
* @return int
15+
*/
16+
function DynamicProgramming($maxSize, $goods, $cost)
17+
{
18+
$container = [];
19+
$goodsCount = count($goods);
20+
21+
//初始化
22+
for ($i = 0; $i <= $maxSize; $i++) {
23+
$container[0][$i] = 0;
24+
}
25+
for ($j = 0; $j <= $goodsCount; $j++) {
26+
$container[$j][0] = 0;
27+
}
28+
for ($j = 1; $j <= $goodsCount; $j++) {
29+
for ($i = 1; $i <= $maxSize; $i++) {
30+
$container[$j][$i] = $container[$j - 1][$i];
31+
//不大于最大的w=15
32+
if ($goods[$j - 1] <= $maxSize) {
33+
if (!isset($container[$j - 1][$i - $goods[$j - 1]])) {
34+
continue;
35+
}
36+
//wi+opt(i-1,wi)
37+
$tmp = $container[$j - 1][$i - $goods[$j - 1]] + $cost[$j - 1];
38+
//opt(i-1,w),wi+opt(i-1,w-wi) => 进行比较
39+
if ($tmp > $container[$j][$i]) {
40+
$container[$j][$i] = $tmp;
41+
}
42+
}
43+
}
44+
}
45+
var_dump($container[$j - 1][$i - 1]);
46+
}
47+
48+
echo DynamicProgramming(15, [3, 4, 5, 6], [8, 7, 4, 9]);

package/Other/Fibonacci.php

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
<?php
2+
/**
3+
* Fibonacci
4+
*
5+
* @author Pu ShaoWei <[email protected]>
6+
* @date 2017/8/25
7+
* @license Mozilla
8+
* -------------------------------------------------------------
9+
* 思路分析:
10+
* -------------------------------------------------------------
11+
* 斐波那契数列(Fibonacci Sequence)又称黄金分割数列 兔子数列
12+
* 指的是这样一个数列:1、1、2、3、5、8、13、21
13+
* 在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*)。
14+
*
15+
* @param $n
16+
* @return int
17+
*/
18+
19+
// recursion
20+
/*
21+
function Fibonacci($n)
22+
{
23+
if ($n <= 1 ) {
24+
return $n;
25+
}
26+
return Fibonacci($n - 1) + Fibonacci($n - 2);
27+
}
28+
*/
29+
// 55
30+
31+
// not recursion
32+
function Fibonacci($n)
33+
{
34+
if ($n <= 1) {
35+
return $n;
36+
}
37+
for ($fib = [0, 1], $i = 2; $i <= $n; $i++) {
38+
$fib[$i] = $fib[$i - 1] + $fib[$i - 2];
39+
}
40+
return $fib[$n];
41+
}
42+
43+
echo Fibonacci(10);
44+
// 55

package/Other/GetCattle.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
/**
4+
* GetCattle
5+
*
6+
* @author Pu ShaoWei <[email protected]>
7+
* @date 2017/8/24
8+
* @license Mozilla
9+
* -------------------------------------------------------------
10+
* 思路分析:见下方注释 
11+
* -------------------------------------------------------------
12+
*
13+
* 牛年求牛:
14+
* 有一母牛,到4岁可生育,每年一头,所生均是一样的母牛
15+
* 15岁绝育,不再能生,
16+
* 20岁死亡,问n年后有多少头牛。
17+
*
18+
* @param $n
19+
* @return int
20+
*/
21+
function getCattle($n)
22+
{
23+
static $num = 1;
24+
for ($i =1; $i<=$n;$i++){
25+
if( $i == 20) break;
26+
if($i >= 4 && $i <15){
27+
if($i % 4 == 0 ){
28+
getCattle($n - $i);
29+
$num++;
30+
}
31+
$num++;
32+
}
33+
}
34+
return $num;
35+
}
36+
echo '牛年共有:'.getCattle(10);
37+
38+
/*
39+
123456789
40+
123456
41+
123
42+
12
43+
9 - 11
44+
45+
---
46+
47+
*/

package/Other/HanoiGames.php

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?php
2+
3+
/**
4+
* HanoiGames
5+
*
6+
* @author Pu ShaoWei <[email protected]>
7+
* @date 2017/8/26
8+
* @license Mozilla
9+
* -------------------------------------------------------------
10+
* 思路分析:
11+
* -------------------------------------------------------------
12+
* 汉诺塔(又称河内塔)问题是印度的一个古老的传说。
13+
* 开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,
14+
* 第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,
15+
* 庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,
16+
* 但每次只能搬一个,而且大的不能放在小的上面。
17+
*
18+
* 面对庞大的数字(移动圆片的次数)18446744073709551615,看来,众僧们耗尽毕生精力也不可能完成金片的移动。
19+
*
20+
* 后来,这个传说就演变为汉诺塔游戏:
21+
* 1.有三根杆子A,B,C。A杆上有若干碟子
22+
* 2.每次移动一块碟子,小的只能叠在大的上面
23+
* 3.把所有碟子从A杆全部移到C杆上
24+
* 经过研究发现,汉诺塔的破解很简单,就是按照移动规则向一个方向移动金片:
25+
* 如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C
26+
* 此外,汉诺塔问题也是程序设计中的经典递归问题。
27+
*
28+
* @param $n
29+
* @param $x
30+
* @param $y
31+
* @param $z
32+
*/
33+
function HanoiGames($n, $x, $y, $z)
34+
{
35+
if ($n == 1) {
36+
echo 'move disk 1 from ' . $x . ' to ' . $z . "\n";
37+
} else {
38+
HanoiGames($n - 1, $x, $z, $y);
39+
echo 'move disk ' . $n . ' from ' . $x . ' to ' . $z . "\n";
40+
HanoiGames($n - 1, $y, $x, $z);
41+
}
42+
}
43+
44+
HanoiGames(3, 'A', 'B', 'C');
45+
46+
// move disk 1 from A to C
47+
// move disk 2 from A to B
48+
// move disk 1 from C to B
49+
// move disk 3 from A to C
50+
// move disk 1 from B to A
51+
// move disk 2 from B to C
52+
// move disk 1 from A to C

package/Other/MonkeyKing.php

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
* @date 2017/8/23
88
* @license Mozilla
99
* -------------------------------------------------------------
10-
* 思路分析:单项循环数据链表 
10+
* 思路分析:约瑟夫环问题
1111
* -------------------------------------------------------------
12-
*有M个monkey ,转成一圈,第一个开始数数,数到第N个出圈,下一个再从1开始数,再数到第N个出圈,直到圈里只剩最后一个就是大王
12+
* 有M个monkey ,转成一圈,第一个开始数数,数到第N个出圈,下一个再从1开始数,再数到第N个出圈,直到圈里只剩最后一个就是大王
1313
*/
1414
class MonkeyKing
1515
{
@@ -64,3 +64,30 @@ public static function whoIsKing($count, $num)
6464
// 共10个猴子每3个出圈
6565
var_dump(MonkeyKing::whoIsKing(10, 3));
6666

67+
function whoIsKing($n,$m){
68+
$r = 0;
69+
for ($i=2; $i <= $n ; $i++) {
70+
$r = ($r + $m) % $i;
71+
}
72+
return $r+1;
73+
}
74+
75+
var_dump(whoIsKing(10,3));
76+
77+
function king($n, $m){
78+
$monkeys = range(1, $n);
79+
$i=0;
80+
$k=$n;
81+
while (count($monkeys)>1) {
82+
if(($i+1)%$m==0) {
83+
unset($monkeys[$i]);
84+
} else {
85+
array_push($monkeys,$monkeys[$i]);
86+
unset($monkeys[$i]);
87+
}
88+
$i++;
89+
}
90+
return current($monkeys);
91+
}
92+
$a = king(10, 3);
93+
var_dump($a);

0 commit comments

Comments
 (0)