提示:给定一个int数组,如果数组在4旁边的2或4旁边包含2,则返回true,但不是两者。
我使用Arrays而没有List方法完成了这项工作,但我想以这种方式进行练习。这就是我所拥有的,Arrays.asList()给了我一些悲伤。
public boolean either24(int[] nums)
{
List list = Arrays.asList(nums);
boolean twos = list.containsAll(Arrays.asList(2, 2));
boolean fours = list.containsAll(Arrays.asList(4, 4));
return (twos || fours) && !(twos && fours);
}
Expected Run
either24({1, 2, 2}) → true true OK
either24({4, 4, 1}) → true true OK
either24({4, 4, 1, 2, 2}) → false false OK
either24({1, 2, 3, 4}) → false false OK
either24({3, 5, 9}) → false false OK
either24({1, 2, 3, 4, 4}) → true false X
either24({2, 2, 3, 4}) → true false X
either24({1, 2, 3, 2, 2, 4}) → true false X
either24({1, 2, 3, 2, 2, 4, 4}) → false false OK
either24({1, 2}) → false true X
either24({2, 2}) → true true OK
either24({4, 4}) → true true OK
either24({2}) → false true X
either24({}) → false false OK
更新:部分问题是使用int而不是Integer。新代码:
public boolean either24(int[] nums)
{
Integer[] nums2 = new Integer[nums.length];
for(int i = 0; i < nums.length; i++)
nums2[i] = nums[i];
List list = Arrays.asList(nums2);
boolean twos = list.containsAll(Arrays.asList(2, 2));
boolean fours = list.containsAll(Arrays.asList(4, 4));
return (twos || fours) && !(twos && fours);
}
答案 0 :(得分:3)
containsAll()
不检查两个元素是否彼此相邻。它仅检查列表中是否存在元素。您需要遍历数组并检查相邻元素
int [] nums = new int [] {1,2,3,4,2,3,2,2,1,-4,4,4};
int len = nums.length;
for (int i = 0; i < len - 1 ; i++)
{
if((nums[i] == nums[i+1]) && (nums[i] == 2 || nums[i] == 4))
{
System.out.println("Yes");
}
}
上面的代码片段没有给你答案。您仍然需要处理问题的but not both
部分,我将留给您。
答案 1 :(得分:2)
问题是您使用的是containsAll
方法。文档说:
如果此列表包含指定集合的所有元素,则返回true。
即使您传入2次,也只是检查列表是否包含2.换句话说,就是说“这个列表有两个吗?好。这个列表有两个吗?好”
答案 2 :(得分:1)
如果只是短代码,那么这也会做到:
public boolean either24(int[] nums) {
String s = Arrays.toString(nums);
boolean twos = s.contains("2, 2");
boolean fours = s.contains("4, 4");
return (twos || fours) && !(twos && fours);
}
答案 3 :(得分:1)
试试这个:
public boolean either24(int[] nums) {
return (Arrays.toString(nums).contains("2, 2") ^ Arrays.toString(nums).contains("4, 4"));
}
答案 4 :(得分:0)
containsAll检查twos / fours是否是列表的子集。它并不关心订单。
containsAll在Java中实现如下:
public boolean containsAll(Collection<?> c) {
// get iterator for collection c
Iterator<?> e = c.iterator();
// loop all elements in collection c
while (e.hasNext())
// if collection A doesn’ have such an element
if(!contains(e.next()))
return false;
return true;
}
正如您所看到的,它只是告诉第二个集合是否是第一个集合的子集而不管顺序。 因此,如果你的列表有一个序列说2,1,2,4,那么containsAll会给出2的列表。
解决方案:您可以实现自己的containsAll版本,例如containsOrderedAll,并使用上面的实现作为参考调用它。
答案 5 :(得分:-1)
public static boolean is2or4(int[] nums){
for (int i = 0; i < nums.length; i++) {
if(nums[i] == 2){
return nums[i+1] == 2;
}else if(nums[i] == 4){
return nums[i+1] == 4;
}
}
return false;
}
我认为上述情况会更有效率。