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

请教一个算法题,谢谢

请教一个算法题,谢谢

猛跑小猪 2019-01-17 07:43:03
有一组数字[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个数字
查看完整描述

3 回答

?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

递归查找符合规则的元素集合:

部分逻辑是建立在认为集合中所有元素都是正数的基础上
(() => {
  var arr = [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

  function calc (arr, total, count, feed = []) {
    if (count === 1) { // check
      return arr.includes(total) ? feed.concat(total) : null
    } else if (count > 1) { // remove big number
      arr = arr.filter(item => item < total)
    } else if (count === 0) { // maybe too large
      return total === 0 ? feed : null
    } else if (total < 0 || count < 0) { // too large
      return null
    }

    for (let [index, item] of Object.entries(arr)) {
      let result = calc([
        ...arr.slice(0, index),
        ...arr.slice(index + 1)
      ], total - item, count - 1, feed.concat(item))

      if (result) return result
    }

    return null
  }
})()
查看完整回答
反对 回复 2019-03-01
?
冉冉说

TA贡献1877条经验 获得超1个赞

请参考以下 python 代码实现

# -*- coding: utf-8 -*-
"""
author: 李毅
"""
from unittest import TestCase


def permutation(array, nsum):
    ''' 假设数组元素不重复。 '''
    # 排序(升序)
    sarray = sorted(array)

    # 找出最大下标
    max_idx = len(sarray)
    for i, e in enumerate(sarray):
        if e > nsum:
            max_idx = i
            break

    # 穷举
    result = []
    for i in range(max_idx):
        for j in range(i, max_idx):
            for k in range(j, max_idx):
                if i == j and j == k:
                    continue
                if sarray[i] + sarray[j] + sarray[k] == nsum:
                    result.append((sarray[i], sarray[j], sarray[k]))
    return result


class Test(TestCase):
    """ 单元测试 """
    def test_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-03-01
  • 3 回答
  • 0 关注
  • 455 浏览

添加回答

举报

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