Нахождение повторяющихся чисел выше или ниже 1, в массиве - PullRequest
0 голосов
/ 29 июня 2009

Мне нужно выяснить, сколько раз число больше или меньше 1 появляется в массиве.

Например, если у меня есть массив:

{1,1,1,2,3,-18,45,1} 

здесь числа, которые больше или меньше единицы, появляются только один раз

Другой пример, если у меня есть массив

{1,1,1,2,3,-18,45,1,0}

здесь числа, которые больше или меньше единицы, появляются дважды, то есть со второго до последнего идет 1, а после этого идет 0

Еще один пример

{1,1,2,3,1,-18,26,1}

здесь числа, которые больше или меньше единицы, появляются дважды, один набор равен {2,3}, то есть один раз, а другой набор - {-18,26}, то есть дважды.

До сих пор я мог зациклить массив, но я застрял .. как это сделать

class Program
{
    static void Main(string[] args)
    {
        System.Console.WriteLine(isOneBalanced(new int[] { 1, 1, 1, 2, -18, 45, 1 }));
    }

    static int isOneBalanced(int[] a)
    {
        foreach(int a1 in a)
        {

        }
        return 0;
    }
}   

как это сделать, кто-нибудь может мне помочь?

Ответы [ 6 ]

2 голосов
/ 29 июня 2009
/* Create variables to be used throughout 
   the process */
int counter = 0;
bool newgroup = true;

/* For each array entry: this loop will
   cycle through our array, accessing one
   item at a time and refer to it as 'a1' */
foreach(int a1 in a) 
{
  /* If 'a1' (our current array entry) is
     absolutely equal to 1, set the value
     of our boolean variable to true */
  if(a1 == 1)   
    newgroup = true;
  else 
  {
    /* Else (meaning, a1 isn't equal to 1), 
       if our variable 'newgroup' is true
       increment our counter variable by 1
       and set our boolean variable to false */
    if(newgroup)
    {
      counter++;    
      newgroup = false;
    }
  }
}    
return counter;
2 голосов
/ 29 июня 2009

Итерация по массиву в цикле foreach и проверка каждого значения на 1 . Если оно меньше 1, увеличьте num_greater на 1, а если оно меньше, увеличьте nun_less на 1.

1 голос
/ 29 июня 2009

Хорошо ... Короче говоря, вы хотите перебрать этот цикл один раз, выяснить, когда вы находитесь "между 1", и увеличить счетчик.

Есть еще одна хитрость или две, хотя ... одна "хитрость" заключается в том, что вы должны уделять особое внимание отслеживанию того, увеличивали ли вы уже для определенного набора или нет. Если ваша серия {1, 3, 5, 1}, вы не хотите делать что-то вроде:

1: don't increment 
3: increment
5: increment       // this is bad!
1: don't increment

потому что в итоге вы получите 2, а не 1. Так что следите за тем, что вы уже увеличили с помощью логического значения ... назовите его как-то вроде "haveIncremented", и вы получите строку типа :

// if (haveIncremented is false)
    // increment my counter
    // set haveIncremented to true

Затем, конечно же, вам нужно будет убедиться, что вы установили значение haveIncremented обратно равным false, когда вы начинаете новый набор. Это произойдет, когда вы прочитаете новое «1» и теперь готовы начать новый «набор».

Я пытаюсь провести тонкую грань между кодированием, объяснением и помощью. Надеюсь, это поможет, не отдавая всю ферму.

Удачи.

0 голосов
/ 29 июня 2009

Это можно рассматривать как проблему конечного автомата с последовательностью входных данных ... отслеживать свое состояние при выполнении итерации и обновлять свое состояние на основе текущего значения массива. Например, одно из состояний может отвечать за увеличение счетчика ограниченных элементов. Это должно быть легко понять, если вы нарисуете это на листе бумаги ... кружки для состояний и стрелки, связывающие состояния в зависимости от типа входного сигнала, который вы видите.

Удачи!

0 голосов
/ 29 июня 2009

Вам нужно логическое значение, чтобы определить, было ли 1 предыдущим значением, и целое число, чтобы подсчитать, сколько раз вы не видите 1, когда установлено логическое значение.

0 голосов
/ 29 июня 2009

Вам нужны две переменные. Один из них является логическим и используется для отслеживания того, находитесь ли вы в серии чисел, которые не равны 1 или -1. Другой является целым числом и используется для отслеживания общего количества встреченных серий.

...