C#二叉树循环问题

时间:2017-05-15 13:59:07

标签: c# loops infinite-loop binary-search

我正在制作一个循环来搜索数组中的值。如果我找到它,将打印该位置,如果它不是"没有这样的号码"将被打印。 但是,如果我有几个相同的数字,我将只收到一个,然后我就在循环中。如果数组中的数字相同,我怎样才能获得控件? 我最好的尝试从一开始就以无限循环或完成循环结束。

static public void Searching(int[] arr)
{
    string x = "yes";

    Console.WriteLine("Enter please searching number");
    while (x == "yes")
    {
        bool found = false;
        int target = Convert.ToInt32(Console.ReadLine());
        int searchkey = target;
        int mid = 0, first = 0, last = arr.Length - 1;
        while (!found && first <= last)
        {
            mid = (first + last) / 2;

            if (target == arr[mid])
                found = true;


            else
            {
                if (target > arr[mid])
                {
                    first = mid + 1;
                }

            if (target < arr[mid])
            {
                last = mid - 1;
            }
        }
    }
    String foundmsg = found
                ? "Item " + searchkey + " was found at position " + mid
                : "Item " + searchkey + " was not found";
    Console.WriteLine(foundmsg);
    Console.WriteLine("would you like to find another number?");
    x = Console.ReadLine();

        }

    }

3 个答案:

答案 0 :(得分:1)

如果您要查找数组中找到特定值的所有位置,请创建一个列表(如List<int>),当您在数组中找到数字时,添加位置到列表。这样您就可以搜索整个数组而不会中断循环。

然后,当您执行完后,列表中将有一个或多个项目,或者列表将为空。如果列表中有项目显示那些。如果列表中没有项目,则返回&#34; not found&#34;消息。

例如,

var indexes = new List<int>();
for(var index = 0; index < source.Length; index++)
{
    if(source[index] == target) indexes.Add(index);
}

当你完成后,你会有一个匹配列表或一个空列表。

许多嵌套循环可能会让人感到困惑。您有一个处理控制台输入的外部循环。使更容易阅读的一种方法是将零件隔离到一个函数中。例如,

List<int> GetIndexesOfMatchingNumbers(int[] source, int target)
{
    var indexes = new List<int>();
    for(var index = 0; index < source.Length; index++)
    {
        if(source[index] == target) indexes.Add(index);
    }
}

您可以从&#34; main&#34;中调用此功能。功能。它在功能上完全相同,但它减少了阅读代码时必须遵循的逻辑量。即使是写作者也很容易理解。

答案 1 :(得分:0)

不要循环这个。 C#内置了一些功能来帮助您。

static public void Searching(int[] arr)
    {
        string x = "yes";

        Console.WriteLine("Please enter a number for which to search...");
        int target = Convert.ToInt32(Console.ReadLine());

        string Response = "Result of search is:"
        +  arr.IndexOf(target) != -1 
        ? arr.IndexOf(target).ToString() : "Not Found";
       //indexOf finds the first index of obj. in array
        Console.WriteLine(Response);
     }

这应该满足你的#34;当我找到一个倍数时,我只收到一个&#34;需求。你总会第一次出现。

如果您需要所有实例并使用循环,那就完全不同了。

static public void Searching(int[] arr)
    {
        string x = "yes";

        Console.WriteLine("Please enter a number for which to search...");
        int target = Convert.ToInt32(Console.ReadLine());
        string result = string.Empty
        for(int i =0; i < arr.Length; i++)
              if (i = target)
              { result += i.ToString() + ", " }
        }
        if(result != string.Empty)
        {
           result = result.SubString(0, result.Length - 2);
           //removes extra space and colon
        } else {
           result = "Not Found";
        }
        Console.WriteLine("Result of search is:"
        + result);
     }

答案 2 :(得分:0)

您可以尝试使用Array.BinarySearch来查找某些项目的索引,然后从索引移动向后转发

  int[] source = new[] { 1, 2, 3, 4, 4, 4, 4, 5, 15, 20 };

  int searchkey = 4;

  int first = -1;
  int last = -1;

  int index = Array.BinarySearch(source, searchkey);

  if (index >= 0) {
    first = index;
    last = index;

    for (int i = index - 1; i >= 0; --i)
      if (source[i] != toFind)
        break;
      else
        first = i;

    for (int i = index + 1; i < source.Length; ++i)
      if (source[i] != toFind)
        break;
      else
        last = i;

    if (first == last)
      Console.Write($"{searchkey} found at {first} position");
    else
      Console.Write($"{searchkey} found at [{first}..{last}] positions");
  }
  else
    Console.Write($"{searchkey} is not found");