同时用python java go快速刷完了《剑指offer》--谈谈感受

博主分享了在刷剑指Offer题目时使用Python、Java和Go三种语言的心得体会,强调了每种语言的特点和优缺点。Python因生态完善和语法简洁而受到青睐,但运行效率较低;Java虽然语法繁琐,但生态强大且类型控制严格;Go语言在简洁和速度上有所平衡,但生态支持不足。此外,博主提到剑指Offer题目的难度适中,适合有一定基础的学习者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上个图证明下先:

 

具体链接:题解_牛客博客

说是刷完,其实是刷到一半中途有个这个想法的。所以只是一部分题目。其中,开始比较简单的一部分题目和最后较难的一部分题目没有用java和go来写。

比较典型的,值得看看的题目有

题解 | #翻转单词序列#_牛客博客1. python 解法(归功于python强大的切片功能以及弱类型引用,写出的代码真的很简洁) # -*- coding:utf-8 -*-class icon-default.png?t=L9C2https://blog.nowcoder.net/n/e0d2f9af5c1444abb1ed232c286e8b24题解 | #调整数组顺序使奇数位于偶数前面#_牛客博客1.python 解法:本来使用了一种不用开辟新的空间,但是移动次数比较多的解法,奈何时间超标了。所以又换了一个简单的解法,简单来说就是先分奇数偶数然后再合并。 ## 代码中的类名、方icon-default.png?t=L9C2https://blog.nowcoder.net/n/c87aaa97e4074cfc9777b94b3fa1ed32题解 | #不用加减乘除做加法#_牛客博客1. python 解法: 核心思想 无进位加法的结果 res = num1^num2, 有进位的结果 carry = (num1&num2)<<1。循环直到没有进位为止。 icon-default.png?t=L9C2https://blog.nowcoder.net/n/76a7e8c8fd0042ddb5fb3906dae2aedd题解 | #数组中重复的数字#_牛客博客1.python 解法:从第一个元素开始执行pop 然后查询是否仍然有这个元素,空间复杂度O(n) ## 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可#icon-default.png?t=L9C2https://blog.nowcoder.net/n/e7805b5511fd4d7b8996e9663f2ade60题解 | #构建乘积数组#_牛客博客1.python 解法:构建两个函数,主函数轮询每一个元素并调用子函数,子函数用于构建每一个元素的乘积。得益于python的列表解析式,整个解法相对简洁 # -*- codinicon-default.png?t=L9C2https://blog.nowcoder.net/n/2c6a1baf1dee4241b0c4d3e39ba3050c题解 | #对称的二叉树#_牛客博客1.python 解法:构造递归函数,设置终止条件。递归函数就是左右节点的val相同,而且左节点的右节点和右节点的左节点val相同,左节点的左节点和右节点的右节点val相同,终止条件是节点都不存在返回icon-default.png?t=L9C2https://blog.nowcoder.net/n/8cba1e2b772f41f6b1bd4722144f5746题解 | #剪绳子#_牛客博客1. python 解法 :dp - 动规划。时间复杂度 O n*log(n)空间复杂度 O n# -*- coding:utf-8 -*-claicon-default.png?t=L9C2https://blog.nowcoder.net/n/5d7a7dd0aae649bb9f9f9d15def2f552题解 | #二叉树的镜像#_牛客博客1. python3 解法: dfs遍历的同时交换,使用了一个栈没有递归# class TreeNode:#     deicon-default.png?t=L9C2https://blog.nowcoder.net/n/358ef80eff1e408f9e4e2dbd4c4a644f

在刷题的过程中,为了更直观的对比三种语言不同的语法,我创建了一个在线文档

https://www.kdocs.cn/p/117528971719icon-default.png?t=L9C2https://www.kdocs.cn/p/117528971719这个在线文档记录了我在刷题过程中遇到的三种语言区别比较大的语法特性。有兴趣可以参考,需要的可以私信我,我会共享出来。

 

谈谈感受吧,先聊聊语言:

python2 和python3是我的主力开发语言,我自己比较了解也用的比较顺手。python是很适合做题,一方面是因为python的生态很完善,相关的api都有,另外一方面是Python的切片功能和列表解析式功能,可以让写出来的代码可以很简洁,同时python都是及时执行的,想在本地调试直接起一个python进程就ok。但是缺点是运行效率低。

java我也是我的开发语言,习惯了用python,真的觉得java的“;”结尾非常的多此一举,同时java括号来括号去的真的很啰嗦。好处是,java的生态可以说是最强大的了,在我印象中论生态java应该是top1的存在,如果你了解一些偏的api或者对官方的最新更新特性比较了解,也可以写出媲美python的简洁的代码。另外一个好处就是java很严谨,有严格的类型控制,不容易出问题,当然这个要在实际生产中才能体现。坏处就是随着时间推移,java也越来越重,现在的web的都是云原生的,基本都是基于k8s,或者至少是docker来构建的,但是一个java镜像就是好几百m,这是不妥的。

go嘛,高情商:博采众长;低情商:四不像。api相关支持太差了,举两个例子:1. 幂函数?没有自己造;2. 栈?没有自己造。go其实也不年轻了,推出这么多年生态还是不够完善,实属拉垮。但是go也有自己好处,在保证运行效率的前提下丢掉了java的一部分括号(只丢中括号不丢大括号也有点迷),去掉了“;”结尾(这个简直救命),同时也可以通过简单的方式来控制类型。另外要吐槽的就是go的异常保护机制了,没有try catch我是不习惯的,至于Ken Thompson说的希望不要扩大化异常处理。。。那就是每一个每一级异常都来处理一遍吗?综合来说,这个语言稍微简洁,运行够快,四不像而且有些特性有些自作主张

 再说说剑指off这套题:

我刷过我司的oj,华为的oj,leetcode几百题,lintcode几十题。综合来说这个题不算难,而且梯度分明,很简单很难的都有分布,同时各个模块都涉及:数组,数学,dp,回溯,二叉树等,综合来说还是很适合有点基础的人琢磨一下的。至于有一定时间开发经验的,可以快速过一下。

以上都是我个人感受哈,别来和我抬杠。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值