Java > Array-2 > twoTwo

Java > Array-2 > twoTwo

问题

给定一个整数数组,return 如果数组中出现的每个 2 都与另一个 2 相邻,则为真。

我的代码只漏掉了这种情况

twoTwo({2, 2, 7, 2, 1}) → false;但是 return 是真的;

我的代码

public boolean twoTwo(int[] nums) {
    int notFound = 0;
    int i = 0;
    boolean found = false;
    if (nums.length == 0) {
        return true;
    }
    if (nums.length == 1 && (nums[0] != 2)) {
        return true;
    }

    for (i = 0; i < nums.length - 1; i++) {

        if ((nums[i] == 2 && nums[i + 1] == 2)) {
            found = true;
        }
        if (nums[nums.length - 1] == 2 && nums[nums.length - 2] != 2) {
            return false;
        }
        if (nums[i] != 2) {
            notFound++;
        }


    }

    if (nums[i] != 2) {
        notFound++;
    }

    if (notFound == nums.length) {
        return true;
    }
    return found;
}
public boolean twoTwo(int[] nums)
{
    if (nums.length == 1 && nums[0] == 2)
        return false;

    for (int i = 0; i < nums.length - 1; i++)
        if (nums[i] == 2)
            if (nums[i + 1] != 2 && (i > 0 && nums[i - 1] != 2))
                return false;
    return true;
}

基本上这会遍历列表中的每个数字,如果找到 2,就会将其与前一个和下一个数字进行比较。仅此而已。

从来没有 "wrong" 方法来编写有效的解决方案,但也有不好的方法。在您的解决方案中,我认为您尝试以混乱的方式处理每个个案,而不是解决首要问题。您到处都有浮动变量和针对每种情况非常具体的硬编码数字。你有不必要的和过度的returns.

我的建议是着手解决您自己的问题 "Return true if all 2's are next to another 2" - 而不是尝试为每个特定案例编写代码。如果您硬编码以解决该问题的特定子集,那么您并没有真正解决问题。

只是我的批评;继续努力。

考虑以此为起点重构你的for循环,看看你能不能搞清楚其中的逻辑(半伪代码):

for(int i = 1; i < nums.length-1; i++) { // Why do I start i at 1?
  if(nums[i]==2) {
    if(nums[i-1] == 2 || nums[i+1] == 2) // What does this if check?
      do something; // What to do here?  Look up the 'continue' keyword.
    else
      return false;
  }
}
return true;

您会发现这个 for 循环只是一个起点。需要添加更多内容,但希望对您来说是一个很好的跳转点。

祝你好运!