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

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

想了好久好久,总觉得拿加减号去凑的话情况太多了,数字怎么分割呢?
想到数字的组合超过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>';
?>

结果:

然后试着写了一边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'])

结果:

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

posted @ 2017-08-01 12:37  真理君的宿敌  阅读(1033)  评论(0编辑  收藏  举报