如果元素在数组中连续出现三次,则返回一个布尔值

时间:2015-12-31 10:22:14

标签: arrays ruby

我正在尝试编写一个接受数组的方法,如果连续三次出现一个元素,则返回true,如果没有,则返回false。我无法想到语法。你会用count吗?请参阅下面的示例。

def got_three?(array)

end

got_three?([1,2,2,3,4,4,4,5,6])将返回true,因为4连续三次显示。

7 个答案:

答案 0 :(得分:3)

使用新的Ruby 2.3.0方法chunk_while

case i: Integer => 42

答案 1 :(得分:3)

使用Enumerable#chunk

def got_three?(xs)
  xs.chunk(&:itself).any? { |y, ys| ys.size >= 3 }
end

答案 2 :(得分:1)

不是那么聪明但是天真(使用a代替array,因为它很长):

a.each_index.any?{|i| a[i] == a[i + 1] and a[i + 1] == a[i + 2]}

我假设您在数组中没有nil

答案 3 :(得分:1)

另一种可能更高效的替代方案(根据@ sawa的评论)...

   if (index == 1){

      savedPlistDictionary = [plistDictionary objectForKey:@"boysinfo"];

   }
   else {

      savedPlistDictionary = [plistDictionary objectForKey:@"girlsinfo"];

   }

}

- (IBAction)Click_Segmentbutton:(id)sender {

   //Pass the selected index segment to function and savedPlistDictionary will be updated accordingly

    switch (segment_Button.selectedSegmentIndex) {
        case 0:{
         [self saveDataWithSelectedIndex:0];  
           break;}
        case 1:{
         [self saveDataWithSelectedIndex:1];
           break;}
    }

  [self.tableView reloadData]; //Reload the tableView

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

   return [savedPlistDictionary count];

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    //Here parse the data and load cells

}

答案 4 :(得分:1)

看,马,没有指数!

def ducks_in_a_row?(arr, n)
  cnt = 0
  last = arr.first
  arr.each do |d|
    if d==last
      cnt += 1
      return true if cnt==n
    else
      last = d
      cnt = 1
    end
  end
  false
end

ducks_in_a_row?([1,2,3,4,5,6,6,7,7,7], 3)
  #=> true

答案 5 :(得分:0)

def got_three?(array)
  array.each_cons(3).map{|g|g.uniq.length == 1}.any?
end

或@wandmaker建议......

def got_three?(array)
  array.each_cons(3).any?{|g|g.uniq.length == 1}
end

答案 6 :(得分:0)

这是我对这个问题的看法 - 我试图使它成为通用的,希望有效率,以便在找到n个连续元素后循环终止。

def got_consecutive?(array, n = 3)
    case array.size
    when 0...n
        return false 
    when n
        return array.uniq.size == n
    else
        array[n..-1].each_with_object(array[0...n]) do |i, t|
            (t.uniq.size == 1 ? (break t) : (t << i).shift)
        end.uniq.size == 1
    end
end

p got_consecutive?([])
#=> false
p got_consecutive?([1,2])
#=> false
p got_consecutive?([1,2,2,3,2,3,3,3], 3)
#=> true
p got_consecutive?([1,2,2,3,2,3,3,3], 4)
#=> false
p got_consecutive?([1,2,2,3,2,3,3,3,3,3,4,4,4,4], 5)
#=> true

代码首先处理边界情况,例如当数组没有n个元素时,答案显然是false,另一个是数组只有n时元素 - 在这种情况下只需要一个唯一性检查即可。

对于数组大小大于n的情况,代码使用Enumerable#each_with_object,初始对象是来自n的{​​{1}}元素数组 - 此数组是也用作临时工作区来跟踪array个连续元素,并检查所有这些元素是否相同。