估计面试没通过,唉

2020-10-27 15:13:32 +08:00
 gdw1986
面试前猎头提示我会考递归,妈的,现学真的搞不定啊,题目是 li = [2,3,5,7,9],输出任意组合,可以重复选,输出所有和是 13 的组合,递归现学现用失败,还是老老实实拿循环写的:
li = [2,3,5,7,9]

def sum13(li):
for i in li:
if i == 13:
print(i)
for j in li:
if i + j == 13:
print(i,j)
for k in li:
if i + j + k== 13:
print(i,j,k)
for l in li:
if i + j + k + l== 13:
print(i,j,k,l)
for o in li:
if i + j + k + l + o == 13:
print(i,j,k,l,o)

我这是面不过了吧?
17606 次点击
所在节点    Python
125 条回复
Mrun
2020-10-28 00:40:11 +08:00
Mrun
2020-10-28 00:43:55 +08:00
@oahebky #25 leetcode 39 和 40,这个是面试的经典题型
kuangwinnie
2020-10-28 03:29:02 +08:00
@oahebky 不是 2sums
ericgui
2020-10-28 03:36:50 +08:00
这是 dfs

你要刷 dfs
xrr2016
2020-10-28 09:01:56 +08:00
第一眼看上去要用回溯法
SuperXRay
2020-10-28 09:16:07 +08:00
dfs + 剪枝 也是递归的一种嘛,猎头没骗你
找测试的话,如果非写代码自动化测试的那种,面这个真的过分了
就说技术岗,我觉得现场写不出来的也有很多

如果并不要求写出正确答案,只从你的解答来看观察专业水平的话,倒也合理
dany813
2020-10-28 09:17:30 +08:00
面试前还是先刷下算法吧
simonlu9
2020-10-28 09:25:17 +08:00
感觉和爬楼梯有多少种爬法一个解法
meathill
2020-10-28 09:36:01 +08:00
楼主让我想起了最近被我开掉的那个哥们儿。说的话听起来好像都懂,表现不好可能是因为临场没发挥出来。结果往细里一看差的不是一点半点。
ymyqwe
2020-10-28 09:44:45 +08:00
dfs 啊,套路都差不多的,怎么剪枝优化才是重点
salamanderMH
2020-10-28 09:51:47 +08:00
回溯法可以做这道题。
fcoolish
2020-10-28 09:52:18 +08:00
这两天刚做了这题,回溯 + 剪枝,题目类型还分数字能不能重复使用。
18870715400
2020-10-28 09:52:43 +08:00
这个应该是回溯吧
def f(lst, target):
ans = []
def dfs(val_index, index):
if sum([lst[i] for i in val_index]) == target:
ans.append([lst[i] for i in val_index])
return
if sum([lst[i] for i in val_index]) > target:
return
for i in range(index, len(lst)):
if i in val_index:
continue
dfs(val_index+[i], i+1)
dfs([], 0)
return ans

print(f([1, 2, 3, 4, 5, 6, 7], 8))
jtwor
2020-10-28 10:08:39 +08:00
回溯把。。
tianhualefei
2020-10-28 10:09:47 +08:00
这是 leetcode 上面第 518 题,的零钱兑换问题 II,给定不同面额的硬币个一个总金额,写出函数计算可以凑成总金额额额硬币组合数。假设每种面额的硬币无限个。

状态表示 dp[i][j],表示数组前 i 个数[0.....i-1]组成金额为 j 的硬币组合数。
第 i 种货币可以不拿,可以拿 1…n 次。
递推方程 dp[i][j]=dp[i-1][j]+dp[i-1][j-coni[i]]+dp[i-1][j-k*coin[i]],简化为
dp[i][j]=dp[i-1][j]+dp[i][j-coin[i]]或一维的 dp[j]=dp[j]+dp[j-coin[i]]。
b1ackjack
2020-10-28 10:11:37 +08:00
dfs 可解,leetcode 有原题
allforone
2020-10-28 10:11:50 +08:00
楼上正解
caoyouming
2020-10-28 10:23:59 +08:00
func combinationSum(candidates []int, target int) [][]int {
return findSum(candidates, target)
}

func findSum(candidates []int, target int) [][]int {
var result [][]int
var list []int
var sum int
for _,val :=range candidates{
if sum + val > target{
return result
}else{
newList := append(list,val)
if sum + val == target{
result = append(result, newList)
}else{
findSum(newList, sum + val)
}
}
}
return result
}
GroupF
2020-10-28 10:24:58 +08:00
我就留个眼睛吧
tankren
2020-10-28 10:36:05 +08:00
还需努力 加油吧 虽然我不会写代码。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/719057

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX