别像我刚开始解决问题时那样天真。尽管我认为时不时地破解几个算法很有趣,面试但我从来没有花太多时间去实践,前解只为解决问题,个算其他什么都不顾,编程可能有时候马马虎虎解决了问题,面试但不明白为什么这样。前解对于我自己,个算我一直在想,编程在一天结束时,面试整天求解算法有点太呆板了,前解它在实际的个算日常工作环境中并没有实际的用途,从长远来看,编程它也不会给我带来多少好处。面试 “在求职过程中,前解了解如何求解算法会给你带来竞争优势” 但事实上,作为程序员,每天的工作中都会出现复杂的问题,大公司必须找到一个标准化的流程来收集求职者解决问题的洞察力和对细节技能的关注。这意味着,在求职过程中,了解如何求解算法将给你带来竞争优势,因为即使是不太出名的公司也倾向于采用类似的评估方法。服务器租用 在我开始更一致地解决算法后不久,我发现有大量的资源可供实践,学习解决这些问题的最有效策略,并为面试做好心理准备。(比如牛客网,力扣,领扣等) 除了练习面试问题外,这些网站通常按公司分组算法,嵌入活跃的博客,让人们分享他们面试经验的详细总结,有时甚至提供模拟面试问题作为高级计划的一部分。 如果你一开始真的很难解决问题,千万不要失望,这是完全正常的。即使是非常有经验的Python程序员也会发现,在没有足够培训的情况下,许多算法很难在短时间内解决。 也不要失望,如果你的面试不像你预期的那样,你刚刚开始解决算法。亿华云有些人每天都会准备好几个月解决一些问题,并定期排练,然后才能敲定面试。 为了帮助您在培训过程中,下面我选择了10种算法(主要围绕字符串操作和数组),这些算法在电话编码面试中一再出现。这些问题的程度主要是相对简单的,但是很容易遇到的,所以请把它们作为一个好的起点。 数字颠倒 平均单词长度 要求您使用字符串应用一些简单计算的算法非常普遍,因此熟悉诸如.replace()和.split()之类的方法非常重要,在这种情况下,这些方法有助于我删除不需要的字符并创建单词列表,其长度很容易测量和求和。 添加字符串 我发现两种方法都同样出色:第一种方法简洁明了,使用直觉式eval()方法动态评估基于字符串的输入,第二种方法巧妙地使用ord()函数来重新构建两种方法字符串作为实际数字通过其字符的Unicode代码点。如果确实要在两者之间进行选择,则我可能会选择第二种方法,因为它一开始看起来比较复杂,但在解决需要更高级的字符串操作算法时通常很方便。 同样在这种情况下,提供了两种可能的解决方案,我想如果您对算法还不熟悉,第一种方法看起来会更加熟悉,因为它是从空字典开始的简单计数器。 但是,从长远来看,理解第二种方法将对您有更多帮助,这是因为在此算法中,我仅使用collection.Counter而不是自己构建chars计数器,而是用enumerate代替了range(len(s)) ,可以帮助您更优雅地识别索引的功能。 有效回文 “有效回文”问题是一个真正的经典,您可能会在许多不同的情况下反复发现它。在这种情况下,任务是通过删除最多一个字符来检查天气,该字符与其相反的字符匹配。当s =sadkas时,该函数通过排除k来返回True,我们得到的单词“ sadas”是回文。 单调数组 这是另一个非常常见的问题,并且上面提供的解决方案非常优雅,因为它可以单行编写。当且仅当数组是单调递增或单调递减且为评估数组时,该数组才是单调的。上述算法利用all()函数的作用,如果iterable中的所有项目均为True,则返回True,否则返回False。如果可迭代对象为空,则all()函数还返回True。 移动零 当您使用数组时,.remove()和.append()方法是宝贵的盟友。在此问题中,我使用它们首先删除属于原始数组的每个零,然后将其附加到同一数组的末尾。 填空白 两次解决方案都必须包含边缘案例(为简单起见,在此省略)。从表面上看,这是一种易于构建的算法,但是您需要牢记要使用for循环和if语句要实现的目标,并应习惯使用None值。 匹配词和不匹配词 这个问题很直观,但是算法利用了一些非常常见的集合操作,例如set(),intersection()或&和symmetric_difference()或^,它们对于使您的解决方案更加优雅非常有用。 质数数组 我想用另一个经典问题来结束本篇文章。如果您既熟悉质数定义又知道模数运算,那么可以很容易地找到一个解决方案,即通过谷值范围(n)(modulus operation)。 结论 在本文中,我分享了10种Python算法的解决方案,这些解决方案是面试时经常遇到的问题。如果您正在准备与知名技术公司的面试,那么本文是您熟悉常见算法模式然后转向更复杂问题的一个很好的起点。还要注意,本文中介绍的练习(及其解决方案)是对力扣和领扣上存在的问题的部分重新解释。我远不是该领域的专家,因此我提供的解决方案仅是指示性的解决方案。为什么练习算法是编程关键?
字符串操作
找到第一个唯一的字符
#给定一个字符串,找到其中的第一个非重复字符并返回其索引。 #如果不存在,则返回-1。#注意:所有输入字符串均已小写。 #Approach 1 def solution(s): frequency = { } for i in s: if i not in frequency: frequency[i] = 1 else: frequency[i] +=1 for i in range(len(s)): if frequency[s[i]] == 1: return i return -1 print(solution(alphabet)) print(solution(barbados)) print(solution(crunchy)) print(---) #Approach 2 import collections def solution(s): # build hash map : character and how often it appears count = collections.Counter(s) # <-- gives back a dictionary with words occurrence count #Counter({ l: 1, e: 3, t: 1, c: 1, o: 1, d: 1}) # find the index for idx, ch in enumerate(s): if count[ch] == 1: return idx return -1 print(solution(alphabet)) print(solution(barbados)) print(solution(crunchy)) Output: 1 2 1 --- 1 2 1 数组