每个软件工程师都应该在 1 个小时内解决的 5 个编程问题 [悲剧版] - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jacob
V2EX    分享发现

每个软件工程师都应该在 1 个小时内解决的 5 个编程问题 [悲剧版]

  •  
  •   jacob 2015-05-09 14:08:23 +08:00 6116 次点击
    这是一个创建于 3807 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近很火的讨论,简单整理了一些: htt://segmentfault.com/a/1190000002746474

    56 条回复    2016-02-11 19:53:00 +08:00
    lincanbin
        1
    lincanbin  
       2015-05-09 14:15:23 +08:00
    美国 圣地亚哥

    这不是国内大学生编程课的基础吗?
    lincanbin
        2
    lincanbin  
       2015-05-09 14:20:26 +08:00
    里面可能大学生可能会卡壳的:也就是斐波那契数列前100位的和的值的长度,已经超过了64位整形所能表示的长度。
    当然这个问题其实也不是问题,稍微思考一下也能解决。
    semicircle21
        3
    semicircle21  
       2015-05-09 14:20:56 +08:00
    哈哈哈哈, 看到结尾释然了, 第四题的时候, 我也突然心中一凉...
    dangge
        4
    dangge  
       2015-05-09 15:41:56 +08:00
    大一狗看完后表示 稍微刷点算法题应该都能写完...
    歪果仁是有多弱...
    PS:Q4想了一下 只会笨拙的暴力比较...有什么好的算法吗?
    9hills
        5
    9hills  
       2015-05-09 16:02:36 +08:00 via iPhone   1
    @dangge 将正整数队列转换为字符串队列并排序即可
    c742435
        6
    c742435  
       2015-05-09 16:06:25 +08:00
    都会但是估计全调完不止一个小时。
    dangge
        7
    dangge  
       2015-05-09 16:23:35 +08:00 via Android
    @9hills 还可以再优化一点,取字符串首位比较
    raincious
        8
    raincious  
       2015-05-09 16:30:35 +08:00   1
    @dangge

    何止,你需要用到树。

    先转换整个整数到字符串,然后做个解析器,将字符串一个个解析出来,然后转换回整数,用插入排序的方式在插入树的时候就将数字排序好。

    用题目上的例子,树应该应该像这样:

    [50,2,1,9]

    1
    2
    5 - 0
    9

    然后迭代这个树就行了。
    9hills
        9
    9hills  
       2015-05-09 16:42:52 +08:00   1
    @dangge 字符串比较就是顺序比较。

    @raincious Python one line
    a=[50,2,1,9]
    print int("".join(sorted(map(str,a), reverse=True)))
    >> 95021
    zsx
        10
    zsx  
       2015-05-09 16:46:17 +08:00   1
    @raincious
    第四题不是一个全排列然后排序不就好了吗……

    ``Javascript

    (function(arr) {
    var resultArray = [];
    (function fn(source, result, callback) {
    if (source.length == 0) {
    callback(result);
    } else {
    source.forEach(function(item, index) {
    fn(source.slice(0, index).concat(source.slice(index + 1)), result.concat(item), callback);
    })
    }
    })(arr, [], function(arr) {
    resultArray.push(arr.join(""));
    });
    resultArray.sort();
    console.log(resultArray[resultArray.length - 1]);
    })([50, 2, 9, 1]);

    ``
    zsx
        11
    zsx  
       2015-05-09 16:49:25 +08:00
    @zsx 效率另说,反正不是算法题(笑
    9hills
        12
    9hills  
       2015-05-09 16:52:56 +08:00
    人生苦短,我用Python。楼上 js的世界我真的不懂。
    zsx
        13
    zsx  
       2015-05-09 16:58:58 +08:00
    @9hills
    对不起我错了……

    [50, 2, 9, 1].map(function(a){return a.toString()}).sort().reverse().join("")
    zsx     14
    zsx  
       2015-05-09 17:00:21 +08:00
    @9hills

    [50, 2, 9, 1].map(String).sort().reverse().join("")

    然而我似乎忘记了String()函数……
    raincious
        15
    raincious  
       2015-05-09 17:08:58 +08:00
    @9hills

    简单+漂亮。

    看到了你的答案我就在PHP里试了一下……

    $numbers = [50,2,1,9];

    rsort($numbers);

    string(5) "50921"

    // PHP 你好聪明,知道这是Int,于是还得用usort自己做个比较函数……
    imn1
        16
    imn1  
       2015-05-09 17:20:27 +08:00
    我觉得确实是基础
    只有斐波那契数列那个不能随手写出来,因为实际工作中没怎么遇到相关的需求,以前写过就忘了

    其他四个都在实际工作中(各种业务)不定时遇到
    Q2/Q4很常见,尤其是Q4,比价常用,Q2则是分类中、或者多次select后合并常用的
    raincious
        17
    raincious  
       2015-05-09 17:21:29 +08:00
    @9hills

    等等,这不对啊……

    如果用[50,500]来做测试,你看

    >>> b=[50,500]
    >>> print int("".join(sorted(map(str,b), reverse=True)))
    50050

    期待的值应该是
    50500
    xjx0524
        18
    xjx0524  
       2015-05-09 17:21:34 +08:00
    @9hills 字符串排序[56,50,5]结果就是56505 实际应该是56550
    batman2010
        19
    batman2010  
       2015-05-09 17:30:27 +08:00
    #!/usr/bin/perl -w
    use strict;

    sub largest {
    my @arr = @_;
    my $res;
    my @arr2 = sort {$b . $a cmp $a . $b} @arr;
    my $iter = 0;
    while ($iter < @arr2) {
    $res .= $arr2[$iter++];
    }
    return $res;
    }

    #main
    my @array = (50, 2, 1, 9);
    print largest(@array), "\n";
    batman2010
        20
    batman2010  
       2015-05-09 17:30:56 +08:00
    @batman2010 俺定的 Q4
    batman2010
        21
    batman2010  
       2015-05-09 17:31:58 +08:00
    @batman2010 s/定/写
    Valyrian
        22
    Valyrian  
       2015-05-09 17:40:51 +08:00
    对于学过算法的,这些题太简单了。只能说搞软件工程的,其实并不涉及复杂的算法。。
    lvfujun
        23
    lvfujun  
       2015-05-09 17:46:08 +08:00
    @zsx 都怪php太聪明要不一样可以这么短.
    lvfujun
        24
    lvfujun  
       2015-05-09 17:46:30 +08:00
    @zsx @错了sorry!
    lvfujun
        25
    lvfujun  
       2015-05-09 17:46:53 +08:00
    @9hills 都怪php太聪明要不一样可以这么短.
    theoractice
        26
    theoractice  
       2015-05-09 17:47:24 +08:00   1
    我觉得q4正确的方法应该是把所有的数分别用其个位数字补齐到位数相同,然后直接排序。
    比如45,4386,23,3,9,4补成4555,4386,2333,3333,9999,4444
    按排序结果就是9 45 4 4386 3 23
    lvfujun
        27
    lvfujun  
       2015-05-09 17:53:08 +08:00
    @raincious php太聪明了+1
    @9hills [phpCode] $a = ['"50"','"2"','"1"','"9"'];rsort($a);print_r($a);[/phpCode]
    lvfujun
        28
    lvfujun  
      2015-05-09 17:58:40 +08:00
    js

    [50,2,1,9].sort().reverse().join("");
    "95021"
    zsx
        29
    zsx  
       2015-05-09 18:02:15 +08:00
    @lvfujun 然后根据楼上的回复发现其实这个解法是错的_(:з」∠)_
    theoractice
        30
    theoractice  
       2015-05-09 18:10:41 +08:00
    我也错了,50和500这种情况无法分辨。不过属于边界情况,单独处理一下也行
    raincious
        31
    raincious  
       2015-05-09 18:13:11 +08:00
    @lvfujun

    你上面的解法其实就是强制PHP将值视为字符串。类似于:

    <?php

    $a = ['50', '2', '1', '9'];
    $b = [];

    foreach ($a as $aa) {
    $b[] = $aa . '-'; // 在最后加一个非数字的字符
    }

    rsort($b);

    var_dump(
    (int)implode('', explode('-', implode('', $b)))
    );

    但是直接的字符串比较或许……不是解法,因为这样无法避免50500变50050的问题。

    拆开再比就没这样的问题了,就像这样:

    1
    2
    5 - 0
    5 - 0 - 0
    9

    (我错了,这其实……是向量组,不是树)

    但是貌似不是很优雅。
    raincious
        32
    raincious  
       2015-05-09 18:15:03 +08:00
    @raincious 我又错了,应该最终排序是这样

    1
    2
    5 - 0 - 0
    5 - 0
    9
    lvfujun
        33
    lvfujun  
       2015-05-09 18:27:51 +08:00
    @raincious 原理很简单其实当很多编程语言里面自带的sort里面如果判断不是number 就按字符ascii码排序.其实这样的解法不是很"准”.
    9hills
        34
    9hills  
       2015-05-09 18:36:08 +08:00
    @raincious
    @xjx0524 恩,这个有个bug,可以补一个compare函数,比如 @theoractice 说的那个办法

    a=[56,50,5]
    max_l = max(map(len, map(str, a)))
    print int("".join(sorted(map(str,a), reverse=True, key=lambda i:i.rjust(max_l, i[-1]))))
    56550
    wdhwg001
        35
    wdhwg001  
       2015-05-09 18:37:10 +08:00 via iPhone
    @theoractice 不用单独处理,改排序函数也行。
    9hills
        36
    9hills  
       2015-05-09 18:39:18 +08:00
    @9hills
    @theoractice 想了想不对。。50和501这种其实也是。。50应该比501要大

    所以还是自己实现一个compare吧,就是丑了点,Python得七八行
    raincious
        37
    raincious  
       2015-05-09 18:44:41 +08:00
    @9hills

    楼主心中默想:“嗯,终于,大家发现了这么简单的问题也是有坑的,那么,我也安心了。”

    于是楼主微笑着,推开了大门走了出去,消失在一片灿烂的阳光中,深藏功与名……
    9hills
        38
    9hills  
       2015-05-09 18:45:30 +08:00
    http://www.v2ex.com/t/189756

    这个tip好像以前见过「cmp=lambda x, y: int(x + y) - int(y + x)」,还是自己弱。。<_<
    qwsqwa
        39
    qwsqwa  
       2015-05-09 19:17:01 +08:00
    搞过ACM的表示第四题重写一个比较函数就好。
    gelupk
        40
    gelupk  
       2015-05-09 19:26:35 +08:00
    choury
        41
    choury  
       2015-05-09 20:10:51 +08:00
    @qwsqwa 我很怀疑你是否真搞过ACM,如你所说,123,1231,12312,三个数你比下,正确结果为:123123121231
    xudufy
        42
    xudufy  
       2015-05-09 21:24:44 +08:00 via Android   1
    @theoractice 你的思路差一点就对了,应该是整体重复补齐,50应该补成5050,5位的话是50505之类
    zhyu
        43
    zhyu  
       2015-05-09 21:31:23 +08:00
    这些题哪用得了一个小时。。20分钟足够了。。。
    zhyu
        44
    zhyu  
       2015-05-09 21:35:59 +08:00
    Q4是leetcode原题,一行就完了,不过会有点长。。
    cmp = lambda x, y: [1, -1][x + y > y + x]
    result = ''.join(sorted(map(str, nums), cmp=cmp)).lstrip('0') or '0'
    zhyu
        45
    zhyu  
       2015-05-09 21:49:06 +08:00
    用python写Q2不能更赞
    from itertools import chain
    result = list(chain.from_iterable(zip(list1, list2)))
    znoodl
        46
    znoodl  
       2015-05-09 22:11:42 +08:00
    我敢说看到第三个题的时候肯定有人想把100个数计算出来一个个加一起
    theoractice
        47
    theoractice  
       2015-05-09 22:30:59 +08:00
    @xudufy 诶,也不对,例如505和5055。看来只能重写compare法了
    xudufy
        48
    xudufy  
       2015-05-09 23:16:44 +08:00 via Android
    @theoractice 刚试了一下要把长的补齐到短的的整倍数 505550 505505 画个图就会发现其实这就是x+y,y+x比较的微观过程
    spacewander
        49
    spacewander  
       2015-05-10 11:33:16 +08:00
    @zhyu
    Ruby只用一行:
    list1.zip(list2).flatten
    reeco
        50
    reeco  
       2015-05-10 13:45:00 +08:00
    @lincanbin 看到美国圣地亚哥就想到金坷拉了
    zhyu
        51
    zhyu  
       2015-05-10 13:55:06 +08:00
    @spacewander
    因为 Ruby 有 Array.flatten 嘛,不过没想到 Ruby 里 Array.zip 居然返回的是 Array of Arrays 。。
    其实能一行搞定的语言有很多,比如 elixir:
    [list1, list2] |> List.zip |> Enum.map(&(Tuple.to_list(&1))) |> List.flatten
    qwsqwa
        52
    qwsqwa  
       2015-05-10 14:47:58 +08:00
    @choury

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cmath>
    using namespace std;

    int n;
    int a[111];

    long long get(const int &a)
    {
    long long ret = 1;
    while(ret < a){
    ret *= 10;
    }
    return ret;
    }

    bool cmp(const int &a, const int &b)
    {
    return (long long)a*get(b)+b > (long long)b*get(a)+a;
    }

    void solve()
    {
    for(int i = 0; i < n; i++){
    scanf("%d",&a[i]);
    }
    sort(a,a+n,cmp);
    for(int i = 0;i < n; i++){
    printf("%d",a[i]);
    }
    puts("");
    }

    int main()
    {
    #ifdef ARTHUR_YANG
    freopen("in.txt", "r", stdin);
    #endif // ARTHUR_YANG
    while(~scanf("%d",&n)) {
    solve();
    }
    return 0;
    }

    搞得不好也不用这么打击人吧……
    402645707
        53
    402645707  
       2015-05-10 22:37:04 +08:00
    表示Q5死活解不出来
    zafkiel
        54
    zafkiel  
       2015-05-11 00:00:06 +08:00
    q5暴力搜索我只会暴力搜索唉
    zafkiel
        55
    zafkiel  
       2015-05-11 00:03:39 +08:00   1
    q3直接用Java把
    rushcheyo
        56
    rushcheyo  
       2016-02-11 19:53:00 +08:00
    这些题目……冬天太冷用来暖手的吧?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     6034 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 02:13 PVG 10:13 LAX 19:13 JFK 22:13
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86