C#和C ++实现之间的结果差异(生成唯一的排列)

时间:2017-02-01 05:23:51

标签: c# c++

我感到非常愚蠢,但我无法弄清楚这一点。

我正在尝试解决Leetcode中的一个问题 - https://leetcode.com/problems/permutations-ii/。我遇到了一个C ++解决方案,它不知道它是如何工作的,所以我决定尝试使用调试器。 我用C#实现了它,但是得到了不同的结果。我无法弄清楚为什么,对我来说代码是一样的。

这是C ++代码:

#include <iostream>     // std::cout
#include <algorithm>    // std::sort
#include <vector>

using namespace std;

void sw(vector<int> &num, int i, int j) {
    int tmp = num[i];
    num[i] = num[j];
    num[j] = tmp;
}

void recursion(vector<int> num, int i, int j, vector<vector<int> > &res)
{   
    if (i == j - 1) {
        res.push_back(num);
        return;
    }
    for (int k = i; k < j; k++) {
        if (i != k && num[i] == num[k]) continue;
        sw(num, i, k);
        recursion(num, i + 1, j, res);
    }
}

vector<vector<int> > permuteUnique(vector<int> &num) {
    sort(num.begin(), num.end());
    vector<vector<int> >res;
    recursion(num, 0, num.size(), res);
    return res;
}



int main()
{
    int myints[] = { 1, 1, 2 };
    std::vector<int> fifth(myints, myints + sizeof(myints) / sizeof(int));
    auto r = permuteUnique(fifth);
    cout << "Count: " << r.size() << "; " ;


    return 0;
}

投放结果为:[1, 1, 2][1, 2, 1][2, 1, 1] 这是C#代码:

public class T47_Permutations_Unique
    {
        public static IList<IList<int>> PermuteUnique(int[] nums)
        {
            if (nums == null || nums.Length == 0)
            {
                return null;
            }

            IList<IList<int>> result = new List<IList<int>>();
            Array.Sort(nums);
            ComputeInternal(nums, result, 0, nums.Length);

            return result;
        }

        private static void ComputeInternal(int[] num, IList<IList<int>> result, int i, int j)
        {
            if (i == j-1)
            {
                var row = new List<int>();
                for (int z = 0; z < num.Length; z++)
                {
                    row.Add(num[z]);
                }
                result.Add(row);
                return;
            }
            for (int k = i; k < j; k++)
            {
                if (i != k && num[i] == num[k])
                {
                    continue;
                }
                Swap(num, i, k);
                ComputeInternal(num, result, i + 1, j);
            }
        }

        private static void Swap(int[] input, int i, int j)
        {
            var tmp = input[i];
            input[i] = input[j];
            input[j] = tmp;
        }
    }

[Fact]
        public void SmokeTest()
        {
            var input = new int[] {1, 1, 2};
            var result = T47_Permutations_Unique.PermuteUnique(input);
            Assert.Equal(3, result.Count);
        }

结果是(5个元素而不是3个元素):[1, 1, 2][1, 2, 1][2, 1, 1][1, 1, 2][1, 2, 1]

两个应用程序基本相同,为什么结果会有差异?

0 个答案:

没有答案