zoukankan      html  css  js  c++  java
  • 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, '
    ')
    
    def printRes(res, idx):
        print('第'+idx+'题:')
        print(res)
        print('========================
    ')
    
    # 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'))+'
    '+'For:'+sum_for(list('123456789'))+'
    '+
             '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版本的基础上做了点改进,少了几行代码。。
    大部分函数靠百度。。写得很吃力
    很多函数方法用法习惯相差很大,代码缩进语法之类还是小问题

  • 相关阅读:
    【angularJS】启动(bootstrap)机制
    【angularJS】定义模块angular.module
    【angularJS】简介
    .NET AutoMapper学习记录
    WebAPI学习
    【MongoDB】在C#中使用
    RabbitMQ介绍及windows下安装使用
    【MongoDB】初识
    php命名空间(nameSpace)的使用详解
    魔术方法
  • 原文地址:https://www.cnblogs.com/dapianzi/p/7267882.html
Copyright © 2011-2022 走看看