提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
每日一练记录。
一、题目
下图中,每个方块代表一个像素,每个像素用其行号和列号表示。
为简化处理,多段线的走向只能是水平、竖直、斜向45度。
上图中的多段线可以用下面的坐标串表示:
(2,8),(3,7),(3,6),(3,5),(4,4),(5,3),(6,2),(7,3),(8,4),(7,5)。
但可以发现,这种表示不是最简的,其实只需要存储6个蓝色的关键点即可,他们是线段的起点,拐点,终点,而剩下的4个点是冗余的。
现在请根据输入的包含有冗余数据的多段线坐标列表,输出其简化的结果。
二、解题
1.代码
代码如下:
public class Main {
public static void main(String[] args) {
int[] nums = {2, 8, 3, 7, 3, 6, 3, 5, 4, 4, 5, 3, 6, 2, 7, 3, 8, 4, 7, 5};
// 输入字符串,转化为坐标系列表
List<int[]> list = new ArrayList<>();
for(int i = 0; i < nums.length; i++) {
int[] num = new int[2];
num[0] = nums[i];
num[1] = nums[i + 1];
list.add(num);
i++;
}
// 计算当前坐标点与下一个坐标点的X点之间的距离、Y点之间的距离
// 遍历坐标系
// 若X、Y之间的距离产生变化,则将坐标点加入结果集中
int index = 0;
int[] num = list.get(index);
List<Integer> result = Arrays.asList(num[0], num[1]);
while(index < list.size() - 1) {
int x = list.get(index + 1)[0] - num[0];
int y = list.get(index + 1)[1] - num[1];
while(index < list.size() - 1 && num[0] + x == list.get(index + 1)[0] && num[1] + y == list.get(index + 1)[1]) {
index++;
num = list.get(index + 1);
}
result.addAll(Arrays.asList(num[0], num[1]);
}
System.out.print(result);
}
}
2.输入
代码如下(示例):
2 8 3 7 3 6 3 5 4 4 5 3 6 2 7 3 8 4 7 5
3.输出
2 8 3 7 3 5 6 2 8 4 7 5