我在接受采访时有以下问题
给定一个数组,您需要找到所有子元素的元素小于给定值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的内容以删除重复项。
这个问题有效吗?
答案 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)}}};");
}
}