今天在聊天群里看到這個圖,貌似是幾個面試題。然后自己動手試了試,結果在第5題卡住了。
image
想了好久好久,總覺得拿加減號去湊的話情況太多了,數字怎么分割呢?
想到數字的組合超過3個除了123其他都不行的
后來去搜了一下,搜到一個python版本,卻怎么看都看不懂
再后來又搜到一個java版本,里面提到說,將空白‘’看成一個運算符
臥槽,瞬間醍醐灌頂。這就變成了將‘+’,‘-’,‘*’,‘/’,‘’ 5個操作符隨機插入1-9的8個空位中。
然后遍歷一下所有可能,計算出符合結果的表達式。bingo!
于是我開始寫代碼,for.. ? 臥槽這怎么個遍歷法啊?然后又回去看那個python代碼
循環每個操作符 -> 接著進入下一層節點 -> 一直到最后一個節點(17) -> 然后返回上一層節點繼續循環下一個操作符 -> 完全遍歷所有節點
這好像是以前學過的深度優先遍歷來著?好吧。。
先寫了一個PHP版本:
<?php
echo '<html><head><title>Hello XiaXue.</title></head><body>';
function echoNoQuestion($idx, $content) {
echo '<h2>第'.$idx.'題</h2>';
echo '<div>'.$content.'</div>';
echo '<hr />';
}
function randomArr($length, $min=1, $max=100) {
$ret = [];
for ($i = 0; $i<$length; $i++) {
$ret[] = rand($min, $max);
}
return $ret;
}
// Q1.
$q1_arr = randomArr(10);
function Q1_a($arr) {
$len = count($arr);
$i = 0;
$sum = 0;
while ($i < $len) {
$sum += $arr[$i];
$i++;
}
return $sum;
}
function Q1_b($arr) {
$len = count($arr);
$sum = 0;
for ($i=0; $i<$len; $i++) {
$sum += $arr[$i];
}
return $sum;
}
function Q1_c($arr) {
$len = count($arr);
if ($len > 1) {
$item = array_pop($arr);
return $item + Q1_c($arr);
} else {
return $arr[0];
}
}
echoNoQuestion(1, 'a:'. Q1_a($q1_arr) . '<br />b:'. Q1_b($q1_arr) .'<br />c:'. Q1_c($q1_arr) );
// Q2.
$q2_arr1 = randomArr(10, 1, 20);
$q2_arr2 = randomArr(10, 100, 200);
function Q2($arr1, $arr2) {
$ret = [];
foreach ($arr1 as $k=>$v) {
$ret[] = $v;
if (isset($arr2[$k])) {
$ret[] = $arr2[$k];
}
}
return $ret;
}
echoNoQuestion(2, 'arr1:'. join(',', $q2_arr1) . '<br />arr2:'. join(',', $q2_arr2) .'<br />c:'. join(',', Q2($q2_arr1, $q2_arr2)) );
// Q3.
function Fibonacci($n=100) {
if ($n == 1) {
return [0];
} elseif ($n == 2) {
return [0, 1];
} else {
$fib = Fibonacci($n-1);
$len = count($fib);
return array_merge($fib, array($fib[$len-1]+$fib[$len-2]));
}
}
echoNoQuestion(3, 'Fibonacci:'. join(', ', Fibonacci(20)) );
// Q4.
$q4_arr = randomArr(5);
function mergeMaxNumber($arr) {
rsort($arr, SORT_STRING );
return join('-', $arr);
}
echoNoQuestion(4, 'Max number:'. mergeMaxNumber($q4_arr) );
// Q5.
$list = range(1, 9);
$idx = 1;
function add100($arr, $next=0) {
global $list, $idx;
$len = count($arr);
if ($len == 17) {
$str = join('', $arr);
if (eval('return '. $str . ';') == 100 ) {
echo $idx.'. '.$str.' = 100<br />';
$idx++;
}
} else {
$exp = ['+','','-'];//,'*','/'];
foreach ($exp as $c) {
$arr[] = $c;
$next++;
$arr[] = $list[$next];
//$arr[] = $arr[$len-1]+1;
add100($arr, $next);
$next--;
array_pop($arr);
array_pop($arr);
}
}
}
echoNoQuestion(5, 'Resut:');
echo date('H:i:s', time()).'<br />';
add100([1]);
echo date('H:i:s', time()).'<br />';
echo '</body></html>';
?>
結果:
image
然后試著寫了一邊python版本:
import random
print('#'*50)
print('#'+'Hello XiaXue'.center(48)+'#')
print('#'*50, '\n')
def printRes(res, idx):
print('第'+idx+'題:')
print(res)
print('========================\n')
# Q1
def sum_while(list_tmp):
l = len(list_tmp)
i = 0
s = 0
while (i < l):
s += int(list_tmp[i])
i += 1
return str(s)
def sum_for(list_tmp):
s = 0
for item in list_tmp:
s += int(item)
return str(s)
def sum_recursive(list_tmp):
l = len(list_tmp)
if l>1:
item = int(list_tmp.pop(-1))
return sum_recursive(list_tmp) + item
else:
return int(list_tmp[0])
printRes('While:'+sum_while(list('123456789'))+'\n'+'For:'+sum_for(list('123456789'))+'\n'+
'Recursive:'+str(sum_recursive(list('123456789'))), '1')
# Q2
list1 = [1,2,3,4,5]
list2 = [6,7,8,9,10,11,12,13]
def mergeList(l1, l2):
n1 = len(l1)
n2 = len(l2)
n = min([n1, n2])
nl = []
i = 0
while i<n:
nl.append(l1[i])
nl.append(l2[i])
i+=1
# bug
#nl.append(l1[(n-1):])
#nl.append(l2[(n-1):])
#[1, 6, 2, 7, 3, 8, 4, 9, 5, 10, [5], [10, 11, 12, 13]]
#fixed
nl.extend(l1[i:])
nl.extend(l2[i:])
return nl
printRes(mergeList(list1, list2), '2')
# Q3
def Fibonacci(n):
if n==1:
return [0]
if n==2:
return [0,1]
if n>2:
fib = Fibonacci(n-1)
fib.append(fib[-2]+fib[-1])
return fib
printRes(Fibonacci(100), '3')
# Q4
def rand_list(n):
x = []
i = 0
while i<n:
x.append(random.randint(1, 99))
i += 1
return x
list_a = rand_list(6)
def merge_number(li):
tmp = []
for n in li:
tmp.append(str(n))
tmp.sort()
tmp.reverse()
return '-'.join(tmp)
printRes(merge_number(list_a), '4')
# Q5
i = 1
def sum_for_100(pattern):
global i
if len(pattern) == 17:
try:
e = ''.join(pattern)
if eval(e) == 100:
print(i, e)
i=i+1
except Exception as e:
pass
else:
x = int(pattern[-1])
for czf in ['+','-','']:
pattern.append(czf)
pattern.append(str(x + 1))
sum_for_100(pattern)
pattern.pop(-1)
pattern.pop(-1)
printRes('', '5')
sum_for_100(['1'])
結果:
image
這里在那個python版本的基礎上做了點改進,少了幾行代碼。。
大部分函數靠百度。。寫得很吃力
很多函數方法用法習慣相差很大,代碼縮進語法之類還是小問題