Find all combinations of a given set of numbers

前端 未结 9 1535
故里飘歌
故里飘歌 2020-12-03 09:30

say I have a set of numbers \'0\', \'1\', \'2\', ..., \'9\'. I want to find all numbers that contain exactly one of each of the numbers in my set.

The problem is: Be

相关标签:
9条回答
  • 2020-12-03 09:48

    Here is my C# 3.0 implementation of permutations you can find useful

    public static class PermutationExpressions
        {
            public static IEnumerable<IEnumerable<T>> Permutations<T>(this IEnumerable<T> list)
            {
                return list.Permutations((uint)list.Count());
            }
    
            public static IEnumerable<IEnumerable<T>> Permutations<T>(this IList<T> list)
            {
                return list.Permutations((uint)list.Count);
            }
    
            private static IEnumerable<IEnumerable<T>> Permutations<T>(this IEnumerable<T> list, uint n)
            {
                if (n < 2) yield return list;
                else
                {
                    var ie = list.GetEnumerator();
                    for (var i = 0; i < n; i++)
                    {
                        ie.MoveNext();
                        var item = ie.Current;
    
                        var i1 = i;
                        var sub_list = list.Where((excluded, j) => j != i1).ToList();
    
                        var sub_permutations = sub_list.Permutations(n - 1);
    
                        foreach (var sub_permutation in sub_permutations)
                        {
                            yield return
                                Enumerable.Repeat(item, 1)
                                    .Concat(sub_permutation);
                        }
                    }
                }
            }
            }
    
    [TestFixture]
        public class TestPermutations
        {
            [Test]
            public void Permutation_Returns_Permutations()
            {
                var permutations = PermutationExpressions.Permutations(new[] { "a", "b", "c" }.AsEnumerable());
                foreach (var permutation in permutations)
                {
                    Console.WriteLine(string.Join("", permutation.ToArray()));
                }
                Assert.AreEqual("abc_acb_bac_bca_cab_cba", permutations.Select(perm => perm.joinToString("")).joinToString("_"));
            }
        }
    
    0 讨论(0)
  • 2020-12-03 09:48

    Nothing to do with dynamic programming; unless you want to wear underpants outside your trousers and paint a symbol on your chest.

    Simple way to do it is maintain an array of 0-9 of integers, then run through the numbers one by one and increment array[num]. The result, once you've processed all digits, is to see if any element of the array is non-zero or one. (That indicates a repeated digit.) Of course, it's trivial to take a number and then iterate through digit by digit using modulus and divisor.

    0 讨论(0)
  • 2020-12-03 09:53

    You're looking to find all permutations of a given set of values.

    One article on "doing" permutations in Java is here: http://www.bearcave.com/random_hacks/permute.html

    You want to skip the first couple of sections until you get to the heading Permutation algorithms (of course).

    0 讨论(0)
提交回复
热议问题