【问题标题】:Finding repeating numbers above or below 1, in an array在数组中查找大于或小于 1 的重复数字
【发布时间】:2009-06-29 18:33:26
【问题描述】:

我需要找出大于或小于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;
    }
}   

如何做到这一点有人可以帮助我吗?

【问题讨论】:

  • 你能改写这个“如果我有一个数组 {1,1,1,2,3,-18,45,1} 这里大于或小于一个的数字只出现一次”我不确定你在说什么。
  • 我的意思是介于 1s 之间的数字组只出现一次,即如果数组是 {1,1,2,3,1,4,5,1} 那么从 {2 ,3} 和 {4,5} 出现在 1s 之间应该算两次
  • 基本上需要统计数组中每一项不为1的序列的个数,这样对吗?如果是这样,艾伦的回答是正确的(至少当他删除 -1 的提及时,正如我所指出的那样)。
  • urm... 我不太明白艾伦给出的答案,我的意思是,我们可以设置一个布尔值来查看我们是否在非 1 系列中,但我们如何计算整个非1 系列为 1
  • @Jarus:这并不是他所说的布尔值的意思。该值决定了您是否已经为这个特定的非 1 系列增加了计数器……因此,请确保添加一次,但只添加一次。您可以在下面查看我的答案以了解有关此问题的更多详细信息,但 Alan 在基础知识方面非常接近(我认为只有他在“-1”上的那一点让我觉得错了。)

标签: c# comparison iteration


【解决方案1】:

Iterate through the array 在 foreach 循环中,test each value against 1。如果小于 1,则将 num_greater 加 1,如果小于,则将 nun_less 加 1。

【讨论】:

    【解决方案2】:
    /* 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;
    

    【讨论】:

    • @Beska:因为他正在为考试而学习,所以代码答案不一定是坏事……尽管它不如解释那么有用。
    • (给发帖者,或者有足够高权限的人这样做......这对一些 cmets 会更有帮助......变量名很好,但这个概念可能仍然存在加上一些关于“你在做什么”的额外评论会更容易一些)
    【解决方案3】:

    好的...简而言之,您想在此循环上迭代一次,确定您何时“介于 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”并准备开始一个新的“集合”时,就会发生这种情况。

    我试图在编码、解释和帮助之间走一条细线。希望这会有所帮助,同时不会放弃整个农场。

    祝你好运。

    【讨论】:

    • 感谢 Beska 我现在知道了,感谢您向我详细解释 =)
    【解决方案4】:

    你需要两个变量。一个是布尔值,用于跟踪您是否处于一系列不等于 1 或 -1 的数字中。另一个是整数,用于跟踪您遇到的系列总数。

    【讨论】:

    • 这个答案似乎是最正确的,但我没有看到任何关于与问题中的 -1 进行比较的内容,所以你应该删除它。
    【解决方案5】:

    您需要一个布尔值来确定 1 是否是前一个值,还需要一个整数来计算设置布尔值时您看不到 1 的次数。

    【讨论】:

      【解决方案6】:

      这可以被视为具有一系列输入的有限状态机问题...在迭代时跟踪您的状态,并根据数组的当前值更新您的状态。例如,其中一种状态可能负责增加有界元素计数器。如果您将其绘制在一张纸上,这应该很容易弄清楚...状态的圆圈,以及根据您看到的输入类型链接状态的箭头。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2014-12-20
        • 2011-09-03
        • 1970-01-01
        • 2014-03-05
        • 1970-01-01
        • 2011-12-10
        相关资源
        最近更新 更多