开发人员和学生解决了很多数据结构和算法的编码问题,但大多数人并不了解它的重要性。他们中的很多人也有这样的看法,数据结构和算法只在面试中有用,之后,在日常工作中就没有使用所有这些复杂的东西了。
您可能是其中一个乐于学习新语言或框架并用它构建一些应用程序的人,但是一旦您进入现实世界的行业,您就会意识到您的工作不仅仅是编写代码并使事情发挥作用。你真正的工作是编写适量的好代码,这意味着它应该是高效和健壮的,数据结构和算法的作用就在这里。数据结构和算法不仅有助于获得程序的逻辑,还有助于为您的软件编写高效的代码。无论我们谈论时间复杂度或内存管理、代码重构还是代码可重用性,您都会了解它在应用程序的每个部分中的价值。
在实际项目中,您的大脑应该能够为复杂的东西编写快速有效的解决方案,而您只有在练习大量编码问题时才能做到这一点。理解语言和框架只是工具,它们不会教你解决问题的技能。当您练习大量编码问题时,您会发展解决问题的技能。首先通过这两篇文章了解DSA的重要性……
- 为什么学习数据结构和算法很重要?
- 我不能在编程中使用逻辑。我应该怎么办?
每个开发人员都有自己的技巧,他们遵循自己的模式来解决编码问题,但是当涉及到新开发人员时,他们总是不确定从哪里开始。他们中的很多人理解问题、逻辑和语法的基础知识,他们也理解其他人的代码,他们可以跟着他们,但是当涉及到自己解决问题时,他们会卡住。即使他们了解语法或逻辑,他们也不明白如何将他们的想法转化为代码。我们将分享一些简单的步骤,以帮助您解决编码问题。
理解和分析问题
不管你以前看过没有看过这个问题,多读几遍问题,就完全理解了。现在,思考这个问题并仔细分析它。有时我们会阅读几行并自行假设其余的事情,但是您的问题的轻微更改可能会更改您代码中的很多内容,因此请注意这一点。现在拿一张纸,写下所有的东西。给出了什么(输入)以及你需要找出什么(输出)?在解决问题时,您需要自己问几个问题……
- 你有没有完全理解问题?
- 你能向其他人解释这个问题吗?
- 需要什么输入和多少输入?
- 这些输入的输出是什么
- 您是否需要从问题中分离出一些模块或部分?
- 你有足够的信息来解决这个问题吗?如果没有,请再次阅读问题或向面试官澄清。
例如:如果给你一个数组,你需要返回只包含偶数的数组,那么首先要仔细分析问题。在解决问题时,您应该在进入解决方案之前问自己几个问题。
- 如何识别偶数?将该数除以 2,看看余数是否为 0。
- 我应该向这个函数传递什么?数组
- 该数组将包含什么?一个或多个数字
- 数组中元素的数据类型是什么?数字
- 最终目标是什么?目标是返回偶数数组。如果没有偶数,则返回一个空数组。
彻底检查示例数据和示例
当您尝试理解问题时,请获取一些示例输入并尝试分析输出。获取一些样本输入将帮助您更好地理解问题。您还将清楚地了解您的代码可以处理多少种情况以及所有可能的输出或输出范围。阅读下面给出的要点……
- 考虑一些简单的输入或数据并分析输出。
- 考虑一些复杂且更大的输入,并确定输出将是什么以及您需要为该问题采取多少个案例。
- 还要考虑边缘情况。分析如果没有输入或您提供一些无效输入,输出会是什么。
例如:如果您需要从给定数组返回偶数数组,那么下面是一些可以分析问题及其输出的各种情况或示例输入。
[1]
[1, 2]
[1, 2, 3, 4, 5, 6]
[-300.35]
[-700.1, 1000, 5.1, -1000.25, 52, 900]
分解问题
当你看到一个复杂或大的编码问题时,与其害怕和困惑如何解决这个问题,不如把问题分解成更小的块,然后尝试解决问题的每一部分。以下是您应该遵循的一些步骤,以解决复杂的编码问题……
- 为手头的问题制作流程图或 UML。
- 将问题分成子问题或更小的块。
- 解决子问题。为每个子问题制作独立的函数。
- 通过按所需顺序或根据需要调用每个子问题的解决方案来连接它们。
- 在需要处理问题时使用类和对象(对于管理系统等实际问题)
写伪代码
在进入解决方案之前,为您的问题编写伪代码总是好的。基本上,伪代码定义了代码的结构,它将帮助您编写解决问题所需的每一行代码。阅读伪代码可以清楚地了解您的代码应该做什么。很多人或有经验的程序员会跳过这一步,但是当您编写伪代码时,编写最终代码的过程对您来说会变得更容易。最后,您只需将每一行伪代码转换为实际代码。所以在你的伪代码中写下每一步和逻辑。下面是返回偶数数组的伪代码示例之一……
function getEvenNumbers
evenNumbers = []
for i = 0 to i = length of evenNumbers
if (element % 2 === 0)
add to that to the array evenNumbers
return evenNumbers
用真实代码替换伪代码
一旦您编写了伪代码,就可以将其转换为实际代码。将伪代码的每一行替换为您正在使用的语言的真实代码。如果你已经把你的问题分成了子问题,那么写下每个子问题的代码。在编写代码时,请记住三件事……
- 你开始的地方
- 你现在在哪?
- 你的目的地(最终结果)是什么?
不要忘记使用样本数据集(我们在第 2 步中讨论过)测试您的代码,以检查实际输出是否等于预期输出。完成编码后,您可以摆脱伪代码。下面是我们在前面的步骤中考虑过的示例的代码……
Javascript
function getEvenNumbers(arrayofNumbers) {
let evenNumbers = []
for (var i = 0; i < arrayofNumbers.length; i++) {
if (arrayofNumbers[i] % 2 === 0) {
evenNumbers.push(arrayofNumbers[i])
}
}
return evenNumbers
}
当您在面试中编写代码时,请不断告诉面试官您是如何解决问题的。
- 告诉面试官你是如何开始的
- 告诉面试官你解决问题的方法
- 与面试官讨论您在问题中面临的最困难的部分。
- 告诉面试官解决每个子问题的方法以获得最终输出。
- 与面试官讨论样本数据或测试用例。
- 与面试官讨论更好的解决方案。
简化和优化您的代码
始终尝试改进您的代码。回顾过去,再次分析并尝试找到更好的或替代的解决方案。我们之前提到过,您应该始终尝试编写适量的优质代码,因此请始终寻找比前一个更有效的替代解决方案。为您的问题编写正确的解决方案并不是您应该做的最后一件事。使用所有可能的解决方案彻底探索问题,然后为您的代码写下最有效或优化的解决方案。因此,一旦您完成了以下代码的解决方案的编写,您应该问自己一些问题。
- 此代码是否针对每个可能的输入(包括边缘情况)运行。
- 是否有针对同一问题的替代解决方案?
- 代码效率高吗?可以更高效还是可以提高性能?
- 你还能如何使代码更具可读性?
- 您还有其他额外的步骤或功能吗?
- 你的代码有重复吗?把它拿出来。
以下是返回偶数的数组相同问题的替代解决方案……
function getEvenNumbers(arrayofNumbers) {
let evenNumbers = arrayofNumbers.filter(n => n % 2 === 0)
return evenNumbers
}