java Codingbat notAlone——为啥它不适用于这个特定的例子

Posted

技术标签:

【中文标题】java Codingbat notAlone——为啥它不适用于这个特定的例子【英文标题】:java Codingbat notAlone — why doesn't it work for this specific examplejava Codingbat notAlone——为什么它不适用于这个特定的例子 【发布时间】:2019-04-26 20:07:05 【问题描述】:

如果数组中的元素前后都有值,并且这些值与它不同,那么我们会说数组中的元素是“单独的”。返回给定数组的一个版本,其中给定值的每个实例都被其左侧或右侧较大的值替换。

notAlone([1, 2, 3], 2) → [1, 3, 3]

notAlone([1, 2, 3, 2, 5, 2], 2) → [1, 3, 3, 5, 5, 2]

notAlone([3, 4], 3) → [3, 4]

public int[] notAlone(int[] nums, int val) 
  for(int k = 1 ; k<nums.length; k++)
  
    if(k!= nums.length-1)
    
      int max = nums[k];
      if(nums[k-1]>nums[k])
        max = nums[k-1];
      else if(nums[k+1] > nums[k])
        max = nums[k+1];
      if(nums[k-1] != nums[k] && nums[k] != nums[k+1])
        nums[k] = max;
    
  
  return nums;

当我在 codingbat 上运行它时,它适用于除此之外的所有示例: notAlone([1, 2, 3, 2, 5, 2], 2) 应该返回[1, 3, 3, 5, 5, 2],但是我的返回[1, 3, 3, 3, 5, 2 ].

我真的被困在如何解决这个问题上,因为在我看来,我所写的内容也应该适用于这个特定的示例,但显然它没有。我的错误来自哪里?我应该如何重写我的代码?任何帮助将不胜感激!

【问题讨论】:

nums[k+1] &gt; nums[k]nums[k-1]&gt;nums[k]。您假设nums[k] 是当前最大的数字。将它们相应地更改为nums[k+1]&gt;maxnums[k-1]&gt;max 您写了if-else-if,假设如果nums[k-1]&gt;maxtrue,那么nums[k+1]&gt;max 不能是true。去掉else,改成两个ifs。 【参考方案1】:

你把事情复杂化了。如果要替换当前元素,则只需要找到上一个和下一个元素的max

public static int[] notAlone(int[] nums, int val) 
    for(int k = 1 ; k<nums.length - 1; k++)
    
        if(nums[k]==val && nums[k-1] != nums[k] && nums[k] != nums[k+1])
            nums[k] = Math.max (nums[k-1], nums[k+1]);
    
    return nums;

顺便说一句,在您的解决方案中,您忽略了给定值 (val):

返回给定数组的一个版本,其中每个单独的给定值实例都被替换...

不过,这不是您的代码在给定情况下失败的原因。您根本没有找到正确的最大值:

k==3:

int max = nums[k]; // max = 2
if(nums[k-1]>nums[k]) // 3 > 2
    max = nums[k-1]; // max = 3
else if(nums[k+1] > nums[k]) // no evaluated. therefore you change num[3] to 3 instead of to 5
    max = nums[k+1];

如果您将这 5 行替换为:

int max = nums[k-1];
if(nums[k+1] > max)
    max = nums[k+1];

你会得到正确的输出。

【讨论】:

以上是关于java Codingbat notAlone——为啥它不适用于这个特定的例子的主要内容,如果未能解决你的问题,请参考以下文章

寻找更pythonic的逻辑解决方案

使用递归来查找字符串中的“hi”数而不是“xhi”

在 return 语句中找不到适合 ArrayList<String> .toArray(String[]::new) 的方法

Java Switch

Java Math

Java 布尔运算