2

Prompt: Given an array of ints, return true if the array contains a 2 next to a 2 or a 4 next to a 4, but not both.

I have done this with just Arrays and no List methods, but I want to do it this way for practice. Here's what I have, Arrays.asList() is giving me some grief.

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   

UPDATE: Part of problem was using int instead of Integer. New code:

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);
}
4

6 回答 6

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问题的一部分,我将留给你。

于 2013-04-18T06:11:59.953 回答
2

问题是您正在使用该containsAll方法。文档说:

如果此列表包含指定集合的​​所有元素,则返回 true。

即使你传入 2 两次,它只是检查列表是否包含 2。换句话说,它是在说,“这个列表有两个吗?好。这个列表有两个吗?好”

于 2013-04-18T06:11:16.623 回答
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);
}
于 2013-04-18T06:19:47.633 回答
1

尝试这个:

public boolean either24(int[] nums) {
    return (Arrays.toString(nums).contains("2, 2") ^ Arrays.toString(nums).contains("4, 4"));       
}
于 2013-04-18T06:29:11.200 回答
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 的列表提供 true。

解决方案:您可以实现自己的 containsAll 版本,例如 containsOrderedAll 并使用上述实现作为参考来调用它。

于 2013-04-18T06:14:41.230 回答
-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;
  }

我认为上述方法会更有效率。

于 2013-04-18T06:12:30.300 回答