元素小于k

时间:2017-10-02 16:34:03

标签: arrays

我在接受采访时有以下问题 给定一个数组,您需要找到所有子元素的元素小于给定值k
例如,

if k=4,
arr[]={4,8,2,4,6}

现在,值小于4的子数组是:

1.{4}
2.{2}
3.{2,4}

注意{4}是如何重复但不考虑两次。现在代码应该返回不同子数组的计数。
在这种情况下3
另一个例子:

k=4
arr[]={2,3,8,2,4,6}

不同的子阵列:

1.{2}
2.{3}
3.{2,3}
4.{4}
5.{2,4}

我的方法是找到小于给定值k的子数组,即O(n ^ 2),然后将其插入类似unordered_set的内容以删除重复项。

这个问题有效吗?

1 个答案:

答案 0 :(得分:0)

所以在摆弄了几分钟之后,我终于想出了一个解决方案,即使你的结果与我的不同,也会逐字逐句地说明你所说的。在您的问题中,您明确指出:

  

给定一个数组,找到所有 不同的子数组 ,其元素 小于 给定值k。< / p>

您提供了以下我在解决方案中使用的示例。

k=4
arr[]={2, 3, 8, 2, 4, 6}

您得出的结论应该是:

1.{2}
2.{3}
3.{2,3}
4.{4}
5.{2,4}

实际上,如果您的要求真正得到满足,那么您将只有三个不同的数组,因为元素必须小于k的提供值,在此示例中为4:< / p>

The values are: 2,3,8,2,4,6
Distinct Arrays Are: {2} {3} {2,3}

解决方案(在C#6.0中)

可以在.NET Fiddle(需要调整到C#4.5)或Visual Studio(目前处理C#6.0)中进行测试。如果最终你需要的话,我不确定如何将它转换回数学公式,但是这个解决方案可以解释所需的结果。

using System;
using System.Collections.Generic;

public class Program {
    static int k = 4;
    static int[] vals = new int[]{ 2, 3, 8, 2, 4, 6 };
    static List<string> distinctVals = new List<string>();
    public static void Main() {
        Console.WriteLine($"The values are: {string.Join(",", vals)}");
        for (int x = 0; x < vals.Length; x++) {
        if (vals[x] < k)
                if (!distinctVals.Contains(vals[x].ToString()))
                    distinctVals.Add(vals[x].ToString());

            for (int y = 0; y < vals.Length; y++) {
                if (vals[y] < k) {
                    if (!distinctVals.Contains(vals[y].ToString()))
                        distinctVals.Add(vals[y].ToString());

                    if (vals[x] < k && vals[x] != vals[y])
                        if (!distinctVals.Contains($"{vals[x]},{vals[y]}"))
                            if (!distinctVals.Contains($"{vals[y]},{vals[x]}"))
                                distinctVals.Add($"{vals[x]},{vals[y]}");
                }
            }
        }

        Console.WriteLine($"There are {distinctVals.Count} distinct array elements.");
        Console.Write($"The distinct elements are: {{{string.Join("}; {", distinctVals)}}};");
    }
}