【问题标题】:I dont understand why this code works (Codingbat Array2 tenRun)我不明白为什么这段代码有效(Codingbat Array 2 taRun)
【发布时间】:2020-02-08 21:30:14
【问题描述】:

对于给定数组中的每个 10 的倍数,将其后面的所有值更改为 10 的倍数,直到遇到另一个 10 的倍数。所以 {2, 10, 3, 4, 20, 5} 产生 {2 , 10, 10, 10, 20, 20}。

我不明白为什么会这样。在我看来,{1, 10, 2, 2} 的输出应该是 {1, 10, 10, 2},因为 for 循环应该只检测 %10 == 0 一次,然后循环返回而不检测它下次。为什么它不止一次这样做?

public int[] tenRun(int[] nums) {
   for (int i = 0; i < nums.length-1; i++) {
      if (nums[i] % 10 == 0) {
          if (nums[i+1] % 10 != 0) {
              nums[i+1] = nums[i];
          }
      }
   }
   return nums;
}

【问题讨论】:

    标签: java arrays for-loop


    【解决方案1】:

    试试这个:-

    public int[] tenRun(int[] nums) {
      for(int i=0;i<nums.length;i++){
        if(nums[i]%10==0){
          for(int j=i+1;j<nums.length && nums[j]%10!=0;j++){
            nums[j]=nums[i];
          }
        }
      }
      return nums;
    }
    

    【讨论】:

    • 请添加一些评论、解释、提示等
    【解决方案2】:

    在每次迭代中,只要条件nums[i] % 10 == 0 的计算结果为true(即nums[i]10 的倍数),它就会检查下一个元素是否不是10 的倍数,即nums[i + 1] % 10 != 0 和如果是这种情况,它将下一个元素设置为nums[i],它是10 的倍数。我希望它可以帮助您了解它的工作原理。如有任何疑问,请随时发表评论。

    import java.util.Arrays;
    
    public class Main {
        public static void main(String[] args) {
            System.out.println(Arrays.toString(tenRun(new int[] { 2, 10, 3, 4, 20, 5 })));
        }
    
        public static int[] tenRun(int[] nums) {
            for (int i = 0; i < nums.length - 1; i++) {
                if (nums[i] % 10 == 0) {
                    if (nums[i + 1] % 10 != 0) {
                        nums[i + 1] = nums[i];
                    }
                }
            }
            return nums;
        }
    }
    

    输出:

    [2, 10, 10, 10, 20, 20]
    

    【讨论】:

    • OOOH 现在我明白了,我不记得元素更新了,谢谢!
    【解决方案3】:

    for 循环只循环nums.length-1 次,它会查看数组中所有重叠的元素对nums[i](我将称之为a)和nums[i+1] (我会打电话给b)。

    for 循环只会改变b,永远不会改变a。它只检查 a 是否是 10 的倍数。如果是,则将 b 设置为 a。查看数组中的最后一对,b 这里是最后一个元素。因此,最后一个元素 可能会被循环更改。

    循环将在某个时候查看nums[1]nums[2],在将nums[2] 设置为10 之后,它现在查看最后一对,即nums[2] (a) 和nums[3] (b)。注意nums[2] 刚刚被设置为 10,因此nums[3] 也可以设置为 10。

    另一方面,循环永远不会设置 first 元素,即第一对的a。这是正确的,因为它不会在任何 10 的倍数之后。

    【讨论】:

      【解决方案4】:

      当您检测到 10 的倍数,然后是 10 的非倍数时,您的算法会更新以下值。在循环的下一次迭代中,您会遇到这个 updated 值。鉴于现在这必须是 10 的倍数,随后的值会被更新。

      如果我们考虑每次迭代开始inums的状态,我们发现:

      0: 1, 10,  2,  2
      1: 1, 10,  2,  2
      2: 1, 10, 10,  2
      

      所以在最后一次迭代中(循环在i == 3 时终止),nums[2] == 10,因此nums[3] 也设置为10

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 2014-04-11
        • 1970-01-01
        • 2014-06-12
        • 2022-06-10
        • 2012-05-25
        • 2012-11-17
        • 2012-09-01
        • 2010-12-14
        相关资源
        最近更新 更多