V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hejw19970413
V2EX  ›  程序员

这几天通过做算法题,谈谈自己的对语言的感觉

  •  
  •   hejw19970413 · 2020-06-17 21:40:25 +08:00 · 4817 次点击
    这是一个创建于 1380 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 Java 中在工具包中,就提供了多种多样的数据结构的支持 map hash 栈 等等。在工业级别上这种的老牌而又稳定的数据以及语言,给予开发者很多的方便。

    在 Go 中没有对应的像 Java 中那么多的数据结构支持,但是在语法上给予开发者足够的想象空间。神奇的“切片”

    在 PHP 中最重要的还是在于 PHP 的数组。PHP 中的数组是万能的小黑,在官方提供的函数给予开发者足够的方便,这可能就是 PHP 能够快速开发的秘诀。

    Python 接触的不多,但是每次用 Python 解决问题,好像不用费太多的步骤,直击要害。但是自己用后的感觉就是自己不知道 Python 在内部搞了什么飞机

    Ps:这个只是自己的感觉。也没有什么太多的感受,就是在相同的思路上,每个语言的实现方式的不同。也能希望得到个位的指点。

    34 条回复    2020-06-19 10:20:57 +08:00
    chizuo
        1
    chizuo  
       2020-06-17 22:36:33 +08:00   ❤️ 3
    C++写算法才是真的爽,上到各种 stl,下到各种优化,随你折腾。
    Vegetable
        2
    Vegetable  
       2020-06-17 23:02:58 +08:00   ❤️ 2
    因为做题默认不能用高级类库方法,只用数据结构,用什么语言这些基础设施的区别没特别大,当然还是会有。

    但是总体来说

    写得爽,跑的憋屈
    写的憋屈,跑的爽
    hejw19970413
        3
    hejw19970413  
    OP
       2020-06-17 23:30:47 +08:00
    @Vegetable 嗯 有道理
    yannxia
        4
    yannxia  
       2020-06-17 23:38:50 +08:00   ❤️ 2
    刷题我感觉最爽的是 Python,直接撸算法核心思想,缺点就 Timeout (个别题目)。
    lithbitren
        5
    lithbitren  
       2020-06-17 23:49:18 +08:00
    如果只写各种语言内的最佳实现,py 的最佳实践九成以上都是调库,标准库实现大概率比自己实现要快,一行版的答案非常多,其他语言则很难说,毕竟一般算法题不用考虑太复杂的边界和类型,可以节省很多数据结构的开销。
    lithbitren
        6
    lithbitren  
       2020-06-17 23:50:41 +08:00
    不过一般也是只有 python 发明了超越传统复杂度的新算法,大家都能大概看懂,其他语言如果出现了新算法,基本没啥人看得懂。
    786375312123
        7
    786375312123  
       2020-06-17 23:54:26 +08:00
    @yannxia python 如果算法对的话,不会 TLE 。很多时候 TLE 了看看评论区
    kidlj
        8
    kidlj  
       2020-06-18 00:13:31 +08:00 via iPhone
    Go 在这些当中是最 accessible 的吧,不论是什么库,点进去看实现,因为没什么 magic,很容易就看懂。
    lithbitren
        9
    lithbitren  
       2020-06-18 00:13:59 +08:00   ❤️ 1
    @786375312123 也不一定,比如 leetcode 839,从比赛变成常规题目的时候扩了数据,导致主流的两种方法用 py 写都过不了,其他主流静态语言都能轻松暴力过,国际版的 py 也没人过,卡了我两个星期才想到分类讨论 ac 了,过了以后我提了意见给官方说是不是应该延长计时,结果官方过了几天也出了一个分类讨论的解法。。
    cmdOptionKana
        10
    cmdOptionKana  
       2020-06-18 00:26:34 +08:00
    @kidlj 与现代语言相比,缺少现代黑魔法,与 C 相比,缺少古代黑魔法,因此貌似真的没有比 Go 更直白的语言了。
    786375312123
        11
    786375312123  
       2020-06-18 00:34:25 +08:00
    @lithbitren 一般你用暴力解法过的,就算 oa 过了,现实中 onsite 面试写出来这种会有大概率挂。你说的本身暴力就不应该让过
    lithbitren
        12
    lithbitren  
       2020-06-18 01:02:11 +08:00
    @786375312123 一般是这么说没错,那题除了 python 需要分类讨论,其他语言完全不需要分类讨论就能 ac,当时几百个通过的人里也没人把分类讨论当正解,常规法写完就完了。leetcode 近千题刷下来,需要在时间复杂度上分类讨论的题目几乎没有,这应该是我遇到唯一一道,很难说是一般面试考察的重点,一般面试最多是要求写出不同时间复杂度的解法。当时 leetcode 的 py 版本是 3.7,分类讨论过这题平均要 4-6 秒,不分类二十秒以上是必然的,而 c++不分类讨论也就是 200-500ms,这个时间量级在 leetcode 里也见怪不怪了,一般不会想到要去分类讨论做这题。
    786375312123
        13
    786375312123  
       2020-06-18 01:16:47 +08:00
    @lithbitren 时间复杂度上需要讨论的多的去了,亚马逊最高频的题 Critical Connections in a Network 就是。
    Mirage09
        14
    Mirage09  
       2020-06-18 03:30:16 +08:00
    @786375312123 那道题是 OA 题,至今不理解为什么要放这种题进 OA...
    786375312123
        15
    786375312123  
       2020-06-18 05:27:56 +08:00
    @Mirage09 你说 Critical Connections in a Network ?没办法,就那么几个恶心的难题,你总要会做。
    yafoo
        16
    yafoo  
       2020-06-18 06:31:24 +08:00 via Android
    所以说,PHP 是世界上最好的语言
    jxie0755
        17
    jxie0755  
       2020-06-18 07:25:08 +08:00 via iPhone
    @lithbitren 自从我发现很多 py 的一行版并不是最快的解法后,我感觉我就不再纠结于一定要一行解决问题了。
    Mirage09
        18
    Mirage09  
       2020-06-18 08:33:53 +08:00
    @786375312123 会做是会做,但是跟其他普通 OA 题差距也太大了…幸好当时没碰到这题
    Mirage09
        19
    Mirage09  
       2020-06-18 08:36:43 +08:00
    Python 的 one-liner 没意义,有本事你面试的时候也这么写…而且你看得懂,能写出来不代表面试官看得懂
    VDimos
        20
    VDimos  
       2020-06-18 08:39:49 +08:00 via Android
    树,图,链表,有些题 leetcode 直接就不提供 rust 版本的。其实 rust 用 raw pointer 也能写,但是官方不开放。
    sxfscool
        21
    sxfscool  
       2020-06-18 08:46:34 +08:00
    有不少 PHPer 分不清 map 和 array[狗头]
    lithbitren
        22
    lithbitren  
       2020-06-18 09:07:12 +08:00 via iPhone
    @786375312123 1192 吗?不是直接 tarjan 嘛,比赛的时候几分钟用拓扑排序 ac 了,比完才意识到拓扑排序是错的,这题怎么讨论
    Rwing
        23
    Rwing  
       2020-06-18 09:17:59 +08:00
    C# ???
    liberty1900
        24
    liberty1900  
       2020-06-18 09:18:12 +08:00 via Android
    发明一种语言,在装编译器的时候可以选择封装度,伪"动态"类型
    goodboy95
        25
    goodboy95  
       2020-06-18 10:00:42 +08:00
    大学一直用 C++搞算法题,工作两年之后想再试试,结果发现 C++没了 split 都会让我非常难受……
    goodboy95
        26
    goodboy95  
       2020-06-18 10:06:21 +08:00
    @786375312123 当初在知乎上看见有人贴这题,给我的感觉就是,打 ACM 的那帮子人到底接触了几百种数据结构和算法啊
    786375312123
        27
    786375312123  
       2020-06-18 15:26:14 +08:00
    @lithbitren 对,“直接”tarjan 。暴力解呗,不需要考虑时间复杂度?
    786375312123
        28
    786375312123  
       2020-06-18 15:44:46 +08:00
    @goodboy95 高频题,就那么几道难的。多做做就好了,其实也没什么麻烦的。都是熟能生巧罢了
    goodboy95
        29
    goodboy95  
       2020-06-18 17:41:47 +08:00
    @786375312123 主要是一群 ACMer 说这是 ACM 签到题,比赛时给人送分的那种……哎,感觉他们这水实在深
    786375312123
        30
    786375312123  
       2020-06-18 17:45:31 +08:00
    @goodboy95 你花个一年时间去备赛也会一样的,这东西就是熟能生巧。。。而且 acm 的难度不是数据结构有多难,大多数情况是读题你得想明白这个题到底是什么问题,用什么样的算法。
    lithbitren
        31
    lithbitren  
       2020-06-18 20:27:07 +08:00
    @786375312123 我说的时间复杂度讨论不是这种,说的是那题的两种解法一种是 O(m*m*n)一种是 O(m*n*n*n),python 必须依据 m 和 n 的数据规模分类讨论成 O(m*n*min(m, n*n))的复杂度才能过,其他语言都不用。
    786375312123
        32
    786375312123  
       2020-06-18 22:56:32 +08:00
    @lithbitren 你不是说暴力吗?暴力你也可以试试遍历树,用其他语言
    12tall
        33
    12tall  
       2020-06-19 09:02:03 +08:00
    @Vegetable 经典啊,woc
    LennieChoi
        34
    LennieChoi  
       2020-06-19 10:20:57 +08:00
    写算法还是 python 最爽啊,不是说它提供了很多工具函数,是他的语法简便性。尤其 A 题的时候,不用写括号,不用写大括号,不用写分号,不用 var,各种懒人操作
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2920 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 78ms · UTC 11:10 · PVG 19:10 · LAX 04:10 · JFK 07:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.