我正在尝试编写一个接受数组的方法,如果连续三次出现一个元素,则返回true
,如果没有,则返回false
。我无法想到语法。你会用count
吗?请参阅下面的示例。
def got_three?(array)
end
got_three?([1,2,2,3,4,4,4,5,6])
将返回true
,因为4
连续三次显示。
答案 0 :(得分:3)
使用新的Ruby 2.3.0方法chunk_while:
case i: Integer => 42
答案 1 :(得分:3)
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
个连续元素,并检查所有这些元素是否相同。