【问题标题】:Java > Array-2 > twoTwoJava > Array-2 > twoTwo
【发布时间】:2015-06-16 22:39:01
【问题描述】:

问题

给定一个整数数组,如果数组中出现的每个 2 都与另一个 2 相邻,则返回 true。

  • twoTwo({4, 2, 2, 3})true

  • twoTwo({2, 2, 4})true

  • twoTwo({2, 2, 4, 2})false

我的代码只是缺少这种情况

twoTwo({2, 2, 7, 2, 1}) → 假;但返回 true;

我的代码

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

【问题讨论】:

  • 我的代码只是缺少这种情况你为什么不通过添加来完成你的代码?
  • 因为我尽最大努力创建干净的代码
  • 问题陈述的重要部分是“给定一个整数数组,如果数组中出现的每个 2 都与另一个 2 相邻,则返回 true。”。其余的只是一些例子来阐明这意味着什么。您应该编写一个适用于所有种情况的程序,而不仅仅是示例。
  • @PatriciaShanahan 是的,我意识到了,谢谢。

标签: java arrays cycle


【解决方案1】:

编写有效的解决方案从来没有“错误”的方法,但也有不好的方法。在您的解决方案中,我认为您尝试以混乱的方式处理每个单独的案例,而不是解决总体问题。你到处都有浮动变量和对每种情况都非常具体的硬编码数字。你有不必要的和过度的回报。

我的建议是解决您自己的问题“如果所有 2 都在另一个 2 旁边,则返回 true” - 而不是尝试为每个特定情况编写代码。如果您硬编码以处理该问题的特定子集,那么您并没有真正解决问题。

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

考虑以此为起点重构你的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 循环只是一个起点。将需要添加更多内容,但希望对您来说是一个很好的跳跃点。

祝你好运!

【讨论】:

  • 我会记住你的批评,谢谢,这真的很有帮助:)
  • 不客气!我希望你喜欢学习 Java——它是一种非常健壮和有趣的语言。请记住,在 StackOverflow 上表示感谢的正确方式是点赞并接受答案。
  • 我还不能投票,但我会接受解决方案,直到我可以投票为止。
  • 你的意思是循环结束后返回true吗?
  • @AlejandroCordobaBodhert Imcphers,我知道它的伪代码,但对于不尝试运行返回 true 的人来说会很有用;在 for 循环内...
【解决方案2】:
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,则会将其与前一个和下一个数字进行检查。就是这样。

【讨论】:

  • 在这里使用 i++ 两次在你的 for 循环中有点令人讨厌。我对你的建议的主要批评。
  • @Imcphers 是的,我想它并不是真正需要的,因为没有它也可以正常工作。但是,在一个满是 2 的数组的情况下,它会加快 2 倍的速度。 :)
  • 我理解并提交了您的解决方案,但它不适用于所有情况,但感谢您的帮助,我会努力改进它。
  • 认为您可以在 for 循环声明中使用 i+=2 而不是 i++。我知道这不是“传统的”,但可能会实现您想要的。我不知道,我从未尝试过。
  • 对于任何最后一个元素为 2 的输入数组,此解决方案均失败。
猜你喜欢
  • 2021-07-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 2015-06-07
  • 1970-01-01
  • 2010-10-19
  • 2022-12-01
  • 2023-03-09
相关资源
最近更新 更多