我理解完毕此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-50是51棵树的意思吗? 疑问
//从坐标0到坐标50是51棵树,所以要加上个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);// 最后输出未被标记的树的数量,即剩下的树的数量
}
}