马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
写在前面
在上一篇笔者的工作感悟【一】笔者讲到了一些个人经历,帮助大家从思维上学生转换到社会人士,在思维成功转换以后,接下来我们就要学会干活,除了一些比较恶劣的职场环境,大部分职场都是把活干好了才能拿到报酬,因此这里笔者想给大家分享一些拙见,帮助大家能够把活干好
问题解答
问题一:要不要刷算法题?
这个问题相信是很多同学都一定会问的,甚至很多同学会说,我看到有些同学即便不刷算法题,也能拿到高薪的工作,那么我是不是不刷算法题我也能在职场中混得还行?
笔者的回答是必须刷,笔者在这里不想从比较功利的角度讨论,大厂面试算法占了多少比重,我们回归到工作的本质来说。
想必大家都知道,计算机是一个傻瓜,没有独立思考能力,我们说前进他不会后退,我们说往东他不会往西,那不知道大家有没有想过,我们作为开发,我们在拿什么指挥它工作,
另外想必也会有感触,我们把自己写好的代码讲给一个门外汉听的时候,我们会发现,即便我们不和他们讲任何专业知识,他们也一样听不懂我们在说什么
事实上,这看似毫无关联的两件事,其实正好是人和计算机交互的正反两面
前一个是人走向计算机,我们要把我们的想法传输给计算机,让它工作
后一个是计算机走向人,我们要把计算机的工作内容还原成人能理解的想法
而连接这两个主体的是什么,就是算法
我们来回顾一下算法的基本概念
算法是一系列解决问题或执行任务的步骤,它描述了在给定输入后,通过一系列有限步骤来产生所需输出的过程。算法在计算机科学和数学中被广泛应用。
算法的特点如下:
- 明确定义:算法必须具有明确的输入和输出,以及一系列明确定义的操作步骤。
- 可执行性:算法必须是可执行的,即可以实际运行并产生结果。
- 有限性:算法必须在有限的时间内运行结束。
- 输入:算法可以接受一个或多个输入。
- 输出:算法可以产生一个或多个输出。
- 确定性:每个步骤都必须具有唯一确定的含义,不会产生二义性。
- 结构化:算法可以由基本操作和控制结构(如顺序结构、分支结构和循环结构)组成,形成一个结构化的整体。
- 有效性:算法应该有效利用计算机资源,如时间和空间。
- 可读性:算法应该易于理解和阅读。
通过设计高效和优化的算法,可以提高问题的解决效率,减少计算资源的使用,满足实际应用的需求。
同学们再回想一下平时做算法题的时候,是不是三个阶段
- 先理解自然语言的问题描述
- 转换成有限计算机工作步骤
- 最后根据你写的步骤来写编程语言
我给大家举一个例子:经典背包问题
问题描述
给定一组具有重量和价值的物品,和一个限制总重量的背包。要求在不超过背包总重量的前提下,选择一些物品放入背包,使得放入背包的物品总价值最大化。
算法步骤
- 定义一个二维数组dp,其中dp[j]表示在背包容量为j的情况下,前i个物品的最大价值。
- 初始化dp数组的第一行和第一列为0,表示没有物品或者背包容量为0的情况下,最大价值都为0。
- 对于每个物品i,遍历所有背包容量j,如果物品i的重量小于等于背包容量j,则可以选择将物品i放入背包,此时背包容量变为j-w,最大价值变为dp[i-1][j-w]+v,即考虑前i-1个物品,在背包容量为j-w的情况下的最大价值加上物品i的价值。
- 如果物品i的重量大于背包容量j,无法将物品i放入背包,最大价值保持为dp[i-1][j]。
- 比较将物品i放入背包与不放入背包两种情况下的最大价值,取较大值作为dp[j]的值。
- 遍历完所有物品和背包容量后,dp数组右下角的值即为问题的解,即在限制背包容量的情况下,可以放入背包的物品总价值最大化。
代码实现
[code]public class KnapsackProblem { public static int knapsack(int[] weights, int[] values, int capacity) { int n = weights.length; int[][] dp = new int[n+1][capacity+1]; for (int i = 1; i |