算法基础——10个常见编程面试题
准备编程面试需要大量的时间。候选人需要学习不同的编码原理、数据结构和算法。递归算法(Recursion)是最重要的算法之一。因为它是许多重要算法的基础,例如分治算法(Divide-and-Conquer Algorithm)、图解算法(Graph Algorithms)、动态规划(Dynamic Programming)、一些基于树的搜索和排序算法等。面试中一定会出现这些算法,所以,在进行编程面试之前反复练习非常重要。
本文将重点讨论基本编程面试中常见的有关递归的基本问题。如果在 Google 中搜索,你会发现这些问题经常出现。本文整理了一些常见的面试问题,你将了解不同的递归算法(Recursion Algorithm)问题,供你练习!如果你想了解更多数据分析相关内容,可以阅读以下这些文章:
Classification Algorithm 101: 一小时学会机器学习的分类算法
如何在分类算法中使用逻辑回归
5种机器学习的分类器算法
支付算法化–算法对支付产业的影响
本文将从易到难,为你讲述面试中的编程问题。本文不是递归算法教程,只提供练习的资源。因为我经常使用 python,我同时会提供Python解决方案。
我建议你先尝试自己解决所有问题,然后再看解决方案。
问题 1
编写一个递归函数,取一个数并返回从0到该数的所有数的总和。
我称该函数为“累积函数(Cumulative Function)”。如果我输入 10 ,该函数将返回从 0 到 10 的所有数字的总和,即 55。
以下为Python解决方案:
def cumulative(num):
if num in [0, 1]:
return num
else:
return num + cumulative(num-1)
问题2
编写一个递归函数,输入一个数字,并返回该数的阶乘(factorial)。
我们都学过阶乘。我称此函数命为“阶乘函数(Factorial Function)”。
以下为Python解决方案:
def factorial(n):
assert n >=0 and int(n) == n, 'The number must be a positive integer only!'
if n in [0,1]:
return 1
else:
return n * factorial(n-1)
问题 3
编写一个递归函数,输入数字“n”并返回第n个斐波那契数。
提醒一下,斐波那契数列是以 0 和 1 开头的正整数序列,其余数字是前两个数字之和:0、1、1、2、3、5、8、11……
以下为Python解决方案:
def fibonacci(n):
if n in [0, 1]:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
问题 4
编写一个递归函数,输入一列数字,并返回列表中所有数字乘积。
如果你不用 Python,Python 中的list就像 Java 或 JavaScript 或 PHP 中的array。
以下为Python解决方案:
def productOfArray(arr):
if len(arr) == 0:
return 0
if len(arr) == 1:
return arr[0]
else:
return arr[len(arr)-1] * productOfArray(arr[:len(arr)-1])
问题 5
编写一个函数,接收字符串,并在该字符串是回文时返回。
提醒一下,如果一个字符串反过来写还是相同,则称为回文。比如Madam,Civic,Kayak。颠倒这些词中的任何一个,意思都将保持不变。
以下为python中的递归解决方案:
def isPalindrom(strng):
if len(strng) == 0:
return True
if strng[0] != strng[len(strng)-1]:
return False
return isPalindrome(strng[1:-1])
如果字符串是回文,则此函数返回 True,否则返回 False。
问题 6
编写一个递归函数,接收字符串并反转该字符串。
如果输入“amazing”,该函数应返回“gnizama”。
以下为Python解决方案:
def reverse(st):
if len(st) in [0, 1]:
return st
else:
return st[len(st)-1] + reverse(st[:len(st)-1])
问题 7
编写一个递归函数,接收一个可能包含更多数组的数组,并返回一个所有值平化的数组。
假设输入以下数组:
[[1], [2, 3], [4], [3, [2, 4]]]
输出应该为:
[1, 2, 3, 4, 3, 2, 4]
以下为Python解决方案:
def flatten(arr):
res = []
for i in arr:
if type(i) is list:
res.extend(flatten(i))
else:
res.append(i)
return res
问题 8
编写一个递归函数,接收一个单词数组,并返回一个包含所有大写单词的数组。
输入以下数组:
['foo', 'bar', 'world', 'hello']
输出数组应该为:
['FOO', 'BAR', 'WORLD', 'HELLO']
以下为Python解决方案:
def capitalizeWords(arr):
if len(arr) == 0:
return []
else:
return [arr[0].upper()]+capitalizeWords(arr[1:])
问题 9
编写一个递归函数,接收一个数组和一个回调函数(Callback Function),如果该数组的值从该回调函数,返回 True,否则返回 False。
在该解决方案中,我使用函数“isEven”作为回调函数,如果数字是偶数,则返回 True,否则返回 False。
以下为回调函数:
def isEven(num):
if num%2==0:
return True
else:
return False
如果输入数组的一个元素从“isEven”函数返回 True,主递归函数应该返回 True,否则返回 False。以下是一个数组:
[1, 2, 3, 5]
递归函数在这里应该返回 True,因为该数组有一个元素是偶数。
以下为Python解决方案:
def anyEven(arr, cb):
if len(arr) == 0:
return False
if cb(arr[0]):
return True
return anyEven(arr[1:], cb)
问题 10
编写一个递归函数,返回字典中所有正数之和,字典中可能包含更多字典。
具体见下例:
obj = {
"a": 2,
"b": {"x": 2, "y": {"foo": 3, "z": {"bar": 2}}},
"c": {"p": {"h": 2, "r": 5}, "q": 'ball', "r": 5},
"d": 1,
"e": {"nn": {"lil": 2}, "mm": 'car'}
该函数应该返回 10。因为该字典包含五个 2, 没有其他偶数。
以下为Python解决方案:
def evenSum(obj, sum=0):
for k in obj.values():
if type(k) == int and k%2 ==0:
sum += k
elif isinstance(k, dict):
sum += evenSum(k, sum=0)
return sum
结论
只有通过大量练习,才能擅长递归函数。但在面试之前,了解上述问题没有什么坏处。没有人能完全押对面试问题,但准备不同的编程问题非常关键。而且截至目前,我从来没有在面试中遇到过特别棘手的问题。面试官通常会提问一些测试基础知识以及解决方案的问题,从而了解你的整体思路。
感谢你的阅读!希望这些关于递归函数的面试题,能对你学习算法有所帮助。你还可以订阅我们的YouTube频道,观看大量数据科学相关公开课:https://www.youtube.com/channel/UCa8NLpvi70mHVsW4J_x9OeQ;在LinkedIn上关注我们,扩展你的人际网络!https://www.linkedin.com/company/dataapplab/
原文作者:Rashida Nasrin Sucky
翻译作者:Lia
美工编辑:过儿
校对审稿:Jiawei Tong
原文链接:https://towardsdatascience.com/10-popular-coding-interview-questions-on-recursion-2ddd8aa86039