1,2,3,4,5,6,7,8,9添加‘+’,‘-’使得结果等于100?

今天在聊天群里看到这个图,貌似是几个面试题。然后自己动手试了试,结果在第5题卡住了。


1,2,3,4,5,6,7,8,9添加‘+’,‘-’使得结果等于100?_第1张图片
image

想了好久好久,总觉得拿加减号去凑的话情况太多了,数字怎么分割呢?
想到数字的组合超过3个除了123其他都不行的
后来去搜了一下,搜到一个python版本,却怎么看都看不懂
再后来又搜到一个java版本,里面提到说,将空白‘’看成一个运算符
卧槽,瞬间醍醐灌顶。这就变成了将‘+’,‘-’,‘*’,‘/’,‘’ 5个操作符随机插入1-9的8个空位中。
然后遍历一下所有可能,计算出符合结果的表达式。bingo!
于是我开始写代码,for.. ? 卧槽这怎么个遍历法啊?然后又回去看那个python代码
循环每个操作符 -> 接着进入下一层节点 -> 一直到最后一个节点(17) -> 然后返回上一层节点继续循环下一个操作符 -> 完全遍历所有节点
这好像是以前学过的深度优先遍历来着?好吧。。
先写了一个PHP版本:

Hello XiaXue.';
function echoNoQuestion($idx, $content) {
    echo '

第'.$idx.'题

'; echo '
'.$content.'
'; echo '
'; } 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) . '
b:'. Q1_b($q1_arr) .'
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) . '
arr2:'. join(',', $q2_arr2) .'
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
'; $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()).'
'; add100([1]); echo date('H:i:s', time()).'
'; echo ''; ?>

结果:


1,2,3,4,5,6,7,8,9添加‘+’,‘-’使得结果等于100?_第2张图片
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 i2:
        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

结果:


1,2,3,4,5,6,7,8,9添加‘+’,‘-’使得结果等于100?_第3张图片
image

这里在那个python版本的基础上做了点改进,少了几行代码。。
大部分函数靠百度。。写得很吃力
很多函数方法用法习惯相差很大,代码缩进语法之类还是小问题

你可能感兴趣的:(1,2,3,4,5,6,7,8,9添加‘+’,‘-’使得结果等于100?)