我有一个整数列表l和一个预定义的整数值行(从不在代码中操作)。如果row的值是5,那么我希望循环退出,如果l包含1,2,3,4或者如果它是3那么l应该包含1,2,依此类推任何值。我已经设计了一种方法来做到这一点,但由于我的意思是在应用程序中使用它,有人可以告诉我一个更好的方法来做到这一点:
do
{
}while(check(row,l))
boolean check(int row,list<int> l)
{
for(int i=1;i<row;i++)
{
if((l.contains(i))
continue();
else
return true;
}
return false;
}
答案 0 :(得分:3)
如果你想检查你的列表是否包含从1到(第1行)的所有数字,你可以使用这样的HashSet
:
var hashSet = new HashSet<int>(myList.Where(item => item >= 1 && item < row))
这会将列表中的所有“相关”项添加到Set。
由于HashSet
最多包含一个项目,因此您可以检查Count
以确保所有数字都存在,例如:
var check = hashSet.Count == (row - 1)
关于性能,这可能比您的解决方案更有效,因为列表只需要迭代一次(在您的解决方案中,您有row-1
个迭代,每个Contains
操作一个迭代。添加到HashSet
被认为是O(1)操作。
注意:此解决方案的主要缺点是它不能立即显示它的作用。所以请考虑添加评论。
如果所有数字都包含在Set中,那么另一种更易读的方法是明确检查,例如
var hashSet = new HashSet<int>(myList);
var check = Enumerable.Range(1, row).All(number => hashSet.Contains(number));
如果将row
视为常数,则渐近时间将相同:构造HashSet
的O(n)和O(1)* O(1)= O(1) )用于检查本身(第一个O(1)表示要检查的常数“行”,第二个O(1)表示Contains
函数...)