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

今天在聊天群里看到这个图,貌似是几个面试题。然后自己动手试了试,结果在第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版本的基础上做了点改进,少了几行代码。。
大部分函数靠百度。。写得很吃力
很多函数方法用法习惯相差很大,代码缩进语法之类还是小问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,071评论 25 707
  • 学生时代谈恋爱可能是最无力的吧,明知道她需要自己自己却隔着屏幕无能为力。
    梦想_More阅读 260评论 0 0
  • 在婚姻生活中,如果爱人背叛了你,青年时期你可能会大哭大闹,甚至不给对方任何余地,一怒之下离婚了断。 如果你是中年了...
    胡杨公主阅读 267评论 4 11
  • 当钱芊带着哭腔与颤抖的声音在多次都拨不通肖音的电话之后她只好给肖音的微信留言,但原因刚写到一半,手机自动关机。急匆...
    万粒阅读 191评论 0 0