Java > Array-2 > twoTwo
Java > Array-2 > twoTwo
问题
给定一个整数数组,return 如果数组中出现的每个 2 都与另一个 2 相邻,则为真。
twoTwo({4, 2, 2, 3})
→true
twoTwo({2, 2, 4})
→true
twoTwo({2, 2, 4, 2})
→false
我的代码只漏掉了这种情况
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 循环只是一个起点。需要添加更多内容,但希望对您来说是一个很好的跳转点。
祝你好运!
问题
给定一个整数数组,return 如果数组中出现的每个 2 都与另一个 2 相邻,则为真。
twoTwo({4, 2, 2, 3})
→true
twoTwo({2, 2, 4})
→true
twoTwo({2, 2, 4, 2})
→false
我的代码只漏掉了这种情况
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 循环只是一个起点。需要添加更多内容,但希望对您来说是一个很好的跳转点。
祝你好运!