我最近遇到过这个问题, 你必须从排序的二维数组中找到一个整数。但是这两个dim数组按行而不是列排序。我已经解决了这个问题,但仍然认为可能有更好的方法。所以我来这里与大家讨论。您的建议和改进将帮助我提高编码能力。这是代码
int searchInteger = Int32.Parse(Console.ReadLine());
int cnt = 0;
for (int i = 0; i < x; i++)
{
if (intarry[i, 0] <= searchInteger && intarry[i,y-1] >= searchInteger)
{
if (intarry[i, 0] == searchInteger || intarry[i, y - 1] == searchInteger)
Console.WriteLine("string present {0} times" , ++cnt);
else
{
int[] array = new int[y];
int y1 = 0;
for (int k = 0; k < y; k++)
array[k] = intarry[i, y1++];
bool result;
if (result = binarySearch(array, searchInteger) == true)
{
Console.WriteLine("string present inside {0} times", ++ cnt);
Console.ReadLine();
}
}
}
}
其中searchInteger是我们必须在数组中找到的整数。二进制搜索是在单维数组中存在值(在该单行中)时返回布尔值的methiod。
请帮助,是最优还是有更好的解决方案。
由于
答案 0 :(得分:1)
如果您已按如下方式声明了数组intarry
,x
和y
:
int[,] intarry =
{
{0,7,2},
{3,4,5},
{6,7,8}
};
var y = intarry.GetUpperBound(0)+1;
var x = intarry.GetUpperBound(1)+1;
// intarry.Dump();
你可以保持简单:
int searchInteger = Int32.Parse(Console.ReadLine());
var cnt=0;
for(var r=0; r<y; r++)
{
for(var c=0; c<x; c++)
{
if (intarry[r, c].Equals(searchInteger))
{
cnt++;
Console.WriteLine(
"string present at position [{0},{1}]" , r, c);
} // if
} // for
} // for
Console.WriteLine("string present {0} times" , cnt);
此示例假定您没有任何关于数组是否已排序的信息(这意味着:如果您不知道它是否已排序,则必须通过每个元素并且不能使用二进制搜索) 。基于此示例,如果您更了解阵列中数据的结构,则可以优化性能:
如果整个数组按升序排序且数据不重复,例如
int [,] intarry = {{0,1,2},{3,4,5},{6,7,8}};
然后您可以在找到项目后立即退出循环。最简单的方法来创建 一个函数,并在内部for循环中添加一个return语句。