镜宇秋霖丶 2023-01-31 02:13 采纳率: 0%
浏览 54

java题有一行不理解,希望解读/解答。

我理解完毕此java题后有一行代码很是不理解,希望大家可以说下自己的理解或者正确的解释:
题目描述:
某校大门外长度为l的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个
数轴,马路的一端在数轴0的位置,另一端在l的位置;数轴上的每个整数点,即0,1,2,...,l,都种有
一棵树。
由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的
起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点
处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
输入格式
第一行有两个整数,分别表示马路的长度l和区域的数目m.
接下来m行,每行两个整数u,v,表示一个区域的起始点和终止点的坐标。
输出格式
输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。
满分答案:
思路: 创建一个布尔类型的数组,用来存储树的状态, Java默认值为false

然后根据读入的区域的起始值, 按顺序把起始位置及中间部分的树的状态标记为true, 最后只需要统计一下false的数量
代码如下:

import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args) throws Exception {
        Scanner cin = new Scanner(System.in);
        int l, m, subway[][];   //   l是英文字母L
        l = cin.nextInt();    //  l是英文字母L
        m = cin.nextInt();
        subway = new int[m][2];
        for(int i=0; i<subway.length; i++){
            subway[i][0] = cin.nextInt();
            subway[i][1] = cin.nextInt();  // 1是数字一
        }
        boolean tree[] = new boolean[l+1]; //存储树的状态的数组 ,l是英文字母L
        // 根据区域的起始标记对应的树的状态为true
        for(int i=0; i<subway.length; i++){
            for(int j=subway[i][0]; j<=subway[i][1]; j++){  //1是数字一
                tree[j] = true;
            }
        }
        int count = 0;
        // 统计未被标记的树
        for(int i=0; i<=l; i++){  // l 是英文字母L
            if(tree[i] == false)
                count++;
        }
        System.out.println(count);
    }
}

不理解的行:
boolean tree[] = new boolean[l+1]; //存储树的状态的数组 ,l是英文字母L
这一行 i 为什么要+1?
假如坐标为0,L的长度为50,算上首尾的树,总共51棵,+1是指50+1=51(棵)的意思吗?
下面为按照我自己的理解写的注释供大家参考:
代码如下:
代码中不知道为什么多了些HTML的代码,希望大家可以忽略他们直接看注释...

import java.io.*;
import java.util.*;
public class Main{
    public static void main(String[] args) throws Exception {
        Scanner cin = new Scanner(System.in);
        int l, m, subway[][];   //ZJ  L表示马路的长度,M是区域的个数,数组是要用到的区域起点和终点
        l = cin.nextInt();    //ZJ 马路长度输入
        m = cin.nextInt();    //ZJ 所要使用的区域个数输入
        subway = new int[m][2];  //ZJ m行输入,即m个区域,2表示两个数,起始点和终止点
        for(int i=0; i<subway.length; i++){     //ZJ  M次输入的起始点和终止点
            subway[i][0] = cin.nextInt();    //ZJ  第(i+1)次的区域起始点
            subway[i][1] = cin.nextInt();    //ZJ    第(i+1)次的区域终止点
        }
        boolean tree[] = new boolean[l+1]; //存储树的状态的数组,
            //ZJ   java中的boolean默认是false。。。
            //ZJ  假如L是50
            //ZJ   50,50棵树吗?到底是什么意思呢?是指0-5051棵树的意思吗?  疑问
            //从坐标0到坐标5051棵树,所以要加上个1 表示首尾的树都算数吗?疑问

        // 根据区域的起始标记对应的树的状态为true
        for(int i=0; i<subway.length; i++){  //ZJ   第(i+1)个区域
            for(int j=subway[i][0]; j<=subway[i][1]; j++){ //ZJ  i表示第(i+1)个区域
            //ZJ   int j=subway[i][0];表示把第(i+1)个区域的起始点的树坐标赋值给了j
            //ZJ  同理 j<=subway[i][1];表示依次标记的树直到终止点的树坐标
            //ZJ subway[i][0]; 表示起始点树的坐标,j++表示区域内的树逐次标记为true
            //ZJ subway[i][1];表示终止点的坐标,J++标记树到此坐标停止标记
            //ZJ j<=subway[i][1];  由于是'<=',所以最后一棵树也算上了正好多一棵树,
            //ZJ  正好是算的51棵树吧,应该是这样的吧,疑问?
                tree[j] = true;  //ZJ   标记区域中的树,包括首尾
            }
        }
        int count = 0;   //ZJ  未标记树的数量为0,计算剩余的树的棵数
        // 统计未被标记的树
        for(int i=0; i<=l; i++){  //ZJ  l是字母L,从0开始遍历,直到路的终点,即L的值
            if(tree[i] == false)   //  如果是未被标记的树,则count的值加1
                count++;
        }
        System.out.println(count);//  最后输出未被标记的树的数量,即剩下的树的数量
    }
}

  • 写回答

2条回答 默认 最新

  • 於黾 2023-01-31 08:21
    关注

    如果L米你想不明白,那你把1代进去,一共1米,两头种树,种几棵树?
    记住这个方法,很有用
    你叫它极限法也行,或者归纳法也行
    很多复杂问题,带入极大值或者极小值,就很容易理解了
    所以不要只记住结论,记住这种思维方法

    评论 编辑记录

报告相同问题?

问题事件

  • 修改了问题 1月31日
  • 创建了问题 1月31日

悬赏问题

  • ¥20 python忆阻器数字识别
  • ¥15 无法输出helloworld
  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真