2

プロンプト: int の配列が与えられた場合、配列に 2 の隣に 2 が含まれている場合、または 4 の隣に 4 が含まれているが、両方が含まれていない場合は 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   

更新: 問題の一部は、Integer の代わりに int を使用していました。新しいコード:

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()2 つの要素が隣り合っているかどうかはチェックしません。要素がリストに存在するかどうかのみをチェックします。配列を反復処理し、隣接する要素を確認する必要があります

        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 回渡しているにもかかわらず、リストに 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 に答える
-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 に答える