zoukankan      html  css  js  c++  java
  • C#语法灵活运用之排列组合算法

    今天群里有朋友求一个排列组合算法,题目是给定长度,输出所有指定字母的组合。

    如指定字母a、b、c、d、e、f,长度为2,则结果应为:aa、ab、ac ... ef、ff。

    有朋友给出算法,很有特色:

                var n = 0;
                for (int i = 0; i < Math.Pow(26, n); ++i)
                {
                    int t = i;
                    string str = "";
                    for (int j = n - 1; j >= 0; --j)
                    {
                        int s = (int)Math.Pow(26, j);
                        str += ((char)('a' + t / s)).ToString();
                        t %= s;
                    }
                    Console.Write(str + " ");
                }
    

    他的解法假定字母组合就是26字母,则看成26进制,非常有创意。

    而我则想到,这个问题可以剥离,逐层追加到指定的长度,并且可以批量处理。

    于是创造了一个全新的算法:

    public List<string> GetList(List<string> src, int num) 
            {
                var res = src;
                for (int i = 1; i < num; i++)
                {
                    res = (from s in src
                           from r in res
                         select s + r).ToList();
                }
                return res;
            }
    

    我的算法是根据指定长度,从一开始,逐层增加元素,每加一次,都是笛卡尔乘积,并且充分利用linq语法的精炼和内部阵列算法的优化,因此我的这个算法非常高效而简洁。

    因此记录在此,以备参考


  • 相关阅读:
    jquery学习笔记
    javascript中的面向对象—— 学习1
    Sql Sever语句 (续2)
    Sql sever 常用语句(续)
    SqlSever 查询基本
    Microsoft SqlSever 数据库--软谋1
    如何编写高质量的Javascript代码
    要当好JavaScript程序员:5个debug技巧
    深入理解js构造函数
    命名空间$.fn
  • 原文地址:https://www.cnblogs.com/foren/p/6009076.html
Copyright © 2011-2022 走看看