为了账号安全,请及时绑定邮箱和手机立即绑定

请教一个算法题,谢谢

请教一个算法题,谢谢

森栏 2019-05-20 17:40:06
有一组数字[0,1,2,3,4,5,6,7,8,9],现给出一个数字,比如3,要求从该组数字中选出相加等于3的组合(相加的数字3个),如0+0+3=3,0+1+2,3个相加的数字不能相同(如1+1+1就不行),无顺序要求。大概函数是这样fun(数组,和值,3),得到的是组合的个数.参数3是相加的数字个数,这里规定是3,如0+0+3,这是3个数字
查看完整描述

2 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

递归查找符合规则的元素集合:
部分逻辑是建立在认为集合中所有元素都是正数的基础上
(()=>{
vararr=[0,1,2,3,4,5,6,7,8,9]
console.log(calc(arr,3,3))//0,1,2
console.log(calc(arr,3,1))//3
functioncalc(arr,total,count,feed=[]){
if(count===1){//check
returnarr.includes(total)?feed.concat(total):null
}elseif(count>1){//removebignumber
arr=arr.filter(item=>item}elseif(count===0){//maybetoolarge
returntotal===0?feed:null
}elseif(total<0||count<0){//toolarge
returnnull
}
for(let[index,item]ofObject.entries(arr)){
letresult=calc([
...arr.slice(0,index),
...arr.slice(index+1)
],total-item,count-1,feed.concat(item))
if(result)returnresult
}
returnnull
}
})()
                            
查看完整回答
反对 回复 2019-05-20
?
红糖糍粑

TA贡献1815条经验 获得超6个赞

请参考以下python代码实现
#-*-coding:utf-8-*-
"""
author:李毅
"""
fromunittestimportTestCase
defpermutation(array,nsum):
'''假设数组元素不重复。'''
#排序(升序)
sarray=sorted(array)
#找出最大下标
max_idx=len(sarray)
fori,einenumerate(sarray):
ife>nsum:
max_idx=i
break
#穷举
result=[]
foriinrange(max_idx):
forjinrange(i,max_idx):
forkinrange(j,max_idx):
ifi==jandj==k:
continue
ifsarray[i]+sarray[j]+sarray[k]==nsum:
result.append((sarray[i],sarray[j],sarray[k]))
returnresult
classTest(TestCase):
"""单元测试"""
deftest_permutation(self):
self.assertEqual(
permutation(range(10),3),
[(0,0,3),(0,1,2)])
self.assertEqual(
permutation(range(10),2),
[(0,0,2),(0,1,1)])
#边界值
self.assertEqual(
permutation(range(3),3),
[(0,1,2)])
self.assertEqual(
permutation(range(1,4),4),
[(1,1,2)])
                            
查看完整回答
反对 回复 2019-05-20
  • 2 回答
  • 0 关注
  • 374 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信