1. 給定一個二維陣列,陣列每一行從左到右都是遞增的,每一列也是遞增的。請完成一個函式,輸入為如上二維陣列和一個整數,函式功能為判斷該整數是否存在於陣列中。時間複雜度儘可能的低。(請說明你的演算法的複雜度。)
下面是一個例子:
二維陣列:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
數字:9
<?php
$array = [
[1, 2, 8, 9],
[2, 4, 9, 12],
[4, 7, 10, 13],
[6, 8, 11, 15],
];
$number = 9;
/**
* 最簡單的方法就是遍歷整個陣列
* 時間複雜度 O(Row*Column-1)
*/
function findNumberInArray($array, $number) {
foreach ($array as $rowArray) {
foreach ($rowArray as $value) {
echo $value, " ";
if ($number == $value) {
return true;
}
}
}
return false;
}
/**
* 從二維陣列的左下角開始逐行查詢
* 時間複雜度 O(Row+Column-1)
*/
function findNumberInArray2($array, $number) {
$minRow = 0;
$minColumn = 0;
$maxRow = count($array) - 1;
$maxColumn = count($array[0]) - 1;
if ($number < $array[0][0] || $number > $array[$maxRow][$maxColumn]) {
return false;
}
for ($row = $maxRow; $row >= $minRow; $row--) {
for ($column = $minColumn; $column <= $maxColumn; $column++) {
echo $array[$row][$column], " ";
if ($array[$row][$column] == $number) {
return true;
}
if ($array[$row][$column] > $number) {
break;
}
if ($array[$row][$column] < $number) {
$minColumn = $column + 1;
}
}
}
return false;
}
/**
* 從二維陣列的右上角開始逐行查詢
* 時間複雜度 O(Row+Column-1)
*/
function findNumberInArray3($array, $number) {
$minRow = 0;
$minColumn = 0;
$maxRow = count($array) - 1;
$maxColumn = count($array[0]) - 1;
if ($number < $array[0][0] || $number > $array[$maxRow][$maxColumn]) {
return false;
}
for ($row = $minRow; $row <= $maxRow; $row++) {
for ($column = $maxColumn; $column >= $minColumn; $column--) {
echo $array[$row][$column], " ";
if ($array[$row][$column] == $number) {
return true;
}
if ($array[$row][$column] > $number) {
$maxColumn = $column - 1;
}
if ($array[$row][$column] < $number) {
break;
}
}
}
return false;
}
echo "/**
* 最簡單的方法就是遍歷整個陣列
* 時間複雜度 O(Row*Column-1)
*/\n";
for ($number = 0; $number <= 15; $number++) {
echo "find ", $number, ": ";
findNumberInArray($array, $number);
echo "\n";
}
echo "/**
* 從二維陣列的左下角開始逐行查詢
* 時間複雜度 O(Row+Column-1)
*/\n";
for ($number = 0; $number <= 15; $number++) {
echo "find ", $number, ": ";
findNumberInArray2($array, $number);
echo "\n";
}
echo "/**
* 從二維陣列的右上角開始逐行查詢
* 時間複雜度 O(Row+Column-1)
*/\n";
for ($number = 0; $number <= 15; $number++) {
echo "find ", $number, ": ";
findNumberInArray3($array, $number);
echo "\n";
}
2.把陣列最開始的若干個元素搬到陣列末尾,稱為陣列的旋轉。給定一個遞增陣列的旋轉陣列,請完成一個函式,時間複雜度儘可能的低,輸出該旋轉陣列的最小元素。並給出複雜度。
例如輸入陣列(4,5,6,7,8,10,1,2,3),輸出 1。
<?php
$array = [4, 5, 6, 7, 8, 10, 1, 2, 3];
/**
* 使用 min() 函式
* 時間複雜度:O(N)
* 原始碼:https://github.com/php/php-src/blob/master/ext/standard/array.c
*/
echo min($array), "\n";
/**
* 使用二分查詢法
* 時間複雜度:O(log2N)
*/
function findMinimumNumberInArray($array, $start = 0, $end = null) {
if ($end == null) {
$end = count($array) - 1;
}
if ($start == $end) {
return $array[$start];
}
$middle = floor(($start + $end) / 2);
if ($array[$start] < $array[$end]) {
return findMinimumNumberInArray($array, $start, $middle);
} else {
return findMinimumNumberInArray($array, $middle, $end);
}
}
echo findMinimumNumberInArray($array), "\n";
3.輸入一個字串,輸出該字串中字元的所有組合。(不限程式語言,請註明你選擇的語言)
下面是一個例子:
輸入引數:字串:“abc”
輸出:“a”, “b”, “c”, “ab”, “ac”, “bc”, “abc”
<?php
$string = "abc";
$length = strlen($string);
/**
* 使用二進位制表示不同的排列組合
*
* 0 0 1 a
* 0 1 0 b
* 0 1 1 ab
* 1 0 0 c
* 1 0 1 ac
* 1 1 0 bc
* 1 1 1 abc
*/
for ($i = 1; $i < 1 << $length; $i++) {
for ($j = 0; $j < $length; $j++) {
if ($i & (1 << $j)) {
echo $string[$j];
}
}
echo "\n";
}
參考:
劍指Offer:名企面試官精講典型程式設計題
https://www.amazon.cn/dp/B00FF1Y0FU/