聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子

简介: 聊聊一个面试中经常出现的算法题:组合运算及其实际应用例子

前言

组合运算是一个数据概念,具体来说,组合运算就是从给定元素集合中选择特定数量的元素进行运算,而不考虑元素的顺序,关注的是哪些元素被选中,而不关心它们的排列顺序。

比如,有一个整数数组 int[] numbers = { 1, 2, 3},它的所有组合就是:

1
2
3
1,2
1,3
2,3
1,2,3

简单例子:列出一个整数数组 int[] numbers = { 1, 2, 3, 4 } 的所有组合

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4 };

        List<List<int>> combinations = GenerateCombinations(numbers);

        foreach (var combination in combinations)
        {
            Console.WriteLine(string.Join(", ", combination));
        }
    }

    static List<List<int>> GenerateCombinations(int[] numbers)
    {
        List<List<int>> result = new List<List<int>>();

        for (int i = 1; i <= numbers.Length; i++)
        {
            GenerateCombinationsUtil(numbers, i, 0, new List<int>(), result);
        }

        return result;
    }

    static void GenerateCombinationsUtil(int[] numbers, int k, int start, List<int> currentCombination, List<List<int>> result)
    {
        if (k == 0)
        {
            result.Add(new List<int>(currentCombination));
            return;
        }

        for (int i = start; i < numbers.Length; i++)
        {
            currentCombination.Add(numbers[i]);
            GenerateCombinationsUtil(numbers, k - 1, i + 1, currentCombination, result);
            currentCombination.RemoveAt(currentCombination.Count - 1);
        }
    }
}

运行后以上代码会生成整数数组 { 1, 2, 3, 4 } 的所有可能组合,并将这些组合打印到控制台。

进阶一:根据需要打印出数组的组合

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
        int[] numbers = { 1, 2, 3, 4 };
        int k = 2; // 选择的元素数量

        List<List<int>> combinations = GenerateCombinations(numbers, k);

        foreach (var combination in combinations)
        {
            Console.WriteLine(string.Join(", ", combination));
        }
    }

    static List<List<int>> GenerateCombinations(int[] numbers, int k)
    {
        List<List<int>> result = new List<List<int>>();
        List<int> currentCombination = new List<int>();

        GenerateCombinationsHelper(numbers, k, 0, 0, currentCombination, result);

        return result;
    }

    static void GenerateCombinationsHelper(int[] numbers, int k, int start, int currentSize, List<int> currentCombination, List<List<int>> result)
    {
        if (currentSize == k)
        {
            result.Add(new List<int>(currentCombination));
            return;
        }

        for (int i = start; i < numbers.Length; i++)
        {
            currentCombination.Add(numbers[i]);
            GenerateCombinationsHelper(numbers, k, i + 1, currentSize + 1, currentCombination, result);
            currentCombination.RemoveAt(currentCombination.Count - 1);
        }
    }
}

进阶二:排列出集合的组合,所进行运算

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static void Main()
    {
    // 创建集合
        List<Item> itemsList = new List<Item>
    {
      new Item { Number = 1, Amount = 100 },
      new Item { Number = 2, Amount = 200 },
      new Item { Number = 3, Amount = 300 }
    };
    
    // 进行组合
    List<List<Item>> combinations = GenerateCombinations(itemsList);

    // 对组合结果进行运算
    StringBuilder sb = new StringBuilder(1024);
    foreach (var combination in combinations)
    {
      for (var i = 0; i < combination.Count; i++)
      {
        var item = combination[i];
        sb.Append(item.Number);
        if (i < combination.Count - 1)
        {
          sb.Append(" + ");
        }
      }
      var cash = combination.Sum(x => x.Amount);
      sb.AppendLine($" = {cash}");
    }
    
    // 打印结果
    Console.WriteLine(sb.ToString());
    }

    static List<List<Item>> GenerateCombinations(List<Item> numbers)
  {
    List<List<Item>> result = new List<List<Item>>();

    // 从 2 个元素开始进行组合
    for (int i=2; i <= numbers.Count; i++)
    {
      GenerateCombinationsHelper(numbers, i, 0, new List<Item>(), result);
    }

    return result;
  }

    static GenerateCombinationsHelper(List<Item> numbers, int k, int start, List<Item> currentCombination, List<List<Item>> result)
  {
    if (k == 0)
    {
      result.Add(new List<Item>(currentCombination));
      return;
    }

    for (int i = start; i < numbers.Count; i++)
    {
      currentCombination.Add(numbers[i]);
      GenerateCombinationsHelper(numbers, k - 1, i + 1, currentCombination, result);
      currentCombination.RemoveAt(currentCombination.Count - 1);
    }
  }
}

// 定义集合元素类
class Item
{
  // 编号
    public int Number { get; set; }
  
  // 金额
    public decimal Amount { get; set; }
}

总结

组合运算是面试中经常被问到的一个算法题,在实际业务中也会经常使用,希望以上例子对你有所帮助。

我是老杨,一个奋斗在一线的资深研发老鸟,让我们一起聊聊技术,聊聊人生。

都看到这了,求个点赞、关注、在看三连呗,感谢支持。


相关文章
|
27天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
41 3
|
1月前
|
消息中间件 测试技术 数据库
吊打面试官!应用间交互如何设计?
【10月更文挑战第18天】设计应用间交互需从明确需求、选择合适方式、设计协议与数据格式、考虑安全性和权限管理、进行性能优化和测试五个方面入手。明确功能和用户需求,选择接口调用、消息队列、数据库共享或文件交换等方式,确保交互高效、安全、可靠。展示这些能力将在面试中脱颖而出。
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法及其应用
【10月更文挑战第8天】 本文将探讨深度学习中常用的优化算法,包括梯度下降法、Adam和RMSProp等,介绍这些算法的基本原理与应用场景。通过实例分析,帮助读者更好地理解和应用这些优化算法,提高深度学习模型的训练效率与性能。
137 63
|
29天前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩分享分库分表的基因算法设计,涵盖分片键选择、水平拆分策略及基因法优化查询效率等内容,助力面试者应对大厂技术面试,提高架构设计能力。
美团面试:百亿级分片,如何设计基因算法?
|
10天前
|
机器学习/深度学习 JSON 算法
二叉树遍历算法的应用场景有哪些?
【10月更文挑战第29天】二叉树遍历算法作为一种基础而重要的算法,在许多领域都有着不可或缺的应用,它为解决各种复杂的问题提供了有效的手段和思路。随着计算机科学的不断发展,二叉树遍历算法也在不断地被优化和扩展,以适应新的应用场景和需求。
20 0
|
21天前
|
存储 算法 搜索推荐
这些算法在实际应用中有哪些具体案例呢
【10月更文挑战第19天】这些算法在实际应用中有哪些具体案例呢
25 1
|
27天前
|
机器学习/深度学习 人工智能 算法
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
66 0
[大语言模型-算法优化] 微调技术-LoRA算法原理及优化应用详解
|
29天前
|
算法 Java 数据库
美团面试:百亿级分片,如何设计基因算法?
40岁老架构师尼恩在读者群中分享了关于分库分表的基因算法设计,旨在帮助大家应对一线互联网企业的面试题。文章详细介绍了分库分表的背景、分片键的设计目标和建议,以及基因法的具体应用和优缺点。通过系统化的梳理,帮助读者提升架构、设计和开发水平,顺利通过面试。
美团面试:百亿级分片,如何设计基因算法?
|
1月前
|
算法 安全 物联网
如何应用SM2算法进行身份认证
【10月更文挑战第5天】如何应用SM2算法进行身份认证
55 1
|
21天前
|
监控 算法 数据挖掘
HyperLogLog算法有哪些应用场景呢
【10月更文挑战第19天】HyperLogLog算法有哪些应用场景呢
14 0