我有一个整数列表
2,5,6,9,45,48,54,76,97,102,134,203,234,245,267,289,299
我想获得一个从31到255的数字列表。如何用C#编码?
答案 0 :(得分:3)
希望这会奏效。刚刚测试过,它工作正常。
int[] x = {2,5,6,9,45,48,54,76,97,102,134,203,234,245,267,289,299};
List<int> y = new List<int>();
for (int i = 0; i < x.Length; i++)
{
if ( (x[i] >= 31) && (x[i] <= 255) )
{
y.Add(x[i]);
}
}
所以我使用x
的数组。然后我创建一个名为y
的列表。我会使用循环来检查值是否符合条件。如果他们这样做,我会将它们添加到y
列表中。
foreach (int k in y)
{
Console.WriteLine(k);
}
使用此循环只是为了确保它有效(可选)。
下次请在发布问题前表明努力。此外,这是一个简单的算法,所以它都是关于循环。即使是初学者程序员也应该知道这一点,只要你知道数组和循环的基础知识。欢迎来到Stack Overflow。
Ansible的回答(效率更高)
但是因为这是一个有序的数组,我们可以通过在我们超过上限后停止搜索来使它更有效。我们知道这些数字都不在我们的范围内。我们可以通过简单地从for循环中断开来做到这一点。
int[] x = {2,5,6,9,45,48,54,76,97,102,134,203,234,245,267,289,299};
List<int> y = new List<int>();
for (int i = 0; i < x.Length; i++)
{
if ( (x[i] >= 31) && (x[i] <= 255) )
{
y.Add(x[i]);
}
else if (x[i] > 255)
{
// We are past the upper bound, we are okay to stop the for loop now.
break;
}
}
但除此之外,我们可以通过对下限实施二进制搜索来提高效率。这样做的目的不是从数组开始处经过所有值开始,而是从中间开始。我们可以通过查看值97(在数组的中间)知道我们的下限必须在数组的前半部分。这已经将我们正在进行的搜索量分成两半。我们可以继续这样做,将数组减半,直到找到我们正在寻找的值。
将它们放在一起它看起来就像这样。
int[] x = {2,5,6,9,45,48,54,76,97,102,134,203,234,245,267,289,299};
List<int> y = new List<int>();
int lowerBoundIndex = binarySearch(array, 0, x.length, 31);
for (int i = lowerBoundIndex; i < x.Length; i++)
{
if ( (x[i] >= 31) && (x[i] <= 255) )
{
y.Add(x[i]);
}
else if (x[i] > 255)
{
// We are past the upper bound, we are okay to stop the for loop now.
break;
}
}
public int binarySearch(int[] array, int lowerbound, int upperbound, int key) {
int position;
// To start, find the subscript of the middle position.
position = (lowerbound + upperbound) / 2;
while (!IsTargetIndex(array, position, key) && (lowerbound <= upperbound)) {
if (array[position] > key) // If the number is > key, ..
{ // decrease position by one.
upperbound = position - 1;
} else {
lowerbound = position + 1; // Else, increase position by one.
}
position = (lowerbound + upperbound) / 2;
}
if (lowerbound <= upperbound) {
return position;
}
return -1;
}
public boolean IsTargetIndex(int[] array, int position, int key)
{
int current = array[position];
int previous;
if (position == 0)
previous = -1;
else
previous = array[position -1];
if ((previous < key) && (current >= key))
{
return true;
}
return false;
}
二进制搜索是从这里获取的,但我不得不修改它,因为我们不是在寻找完全匹配,而是第一个大于或等于下限的项目。这是在IsTargetIndex中完成的。
这可能是也可能不是过度杀伤。如果你的阵列很小,那么这可能不会带来很大的性能提升。但想象一下,如果你的阵列是数百万个节点,那么这可以节省大量时间。
下次请在发布问题前表明努力。此外,这可以通过一个简单的算法完成,所以它都是关于循环。即使是初学者程序员也应该知道这一点,只要你知道数组和循环的基础知识。欢迎来到Stack Overflow。