最近在网上无意间看到了一张字节跳动的编程笔试题,试着做了做,发现做法可能稍显臃肿了,发出来看看哪位大神给指点一下,看看怎么做可以更简洁高效;
试卷如下:
第一题
思路:将每个点看成是链表的一个节点,先求出周长,再等分,然后遍历链表节点,寻找等分点,保存在新链表中,注意等分份数;
/**
* @Author: pisces
* @Description:
* @Date: Create in 10:56 2020/5/27
* @Modified By:
*/
public class ZiJieSplitGirth {
/**
* 有一个n边形(P0、P1、···、Pn),每一边皆为垂直或者水平的线段,现给定数值k,
* 以P0为起点将n边形的周长分为k段,每段的长度相同,请打印出所有的k的等分点
* (T0、T1、···、Tk)的坐标
* <p>
* 将n边形的各个点的坐标转换成一个链表,将头节点与要等分的份数传入
* 此方法默认周长可以被k等分
*/
public static void splitGirth(PointNode pHead, int k) {
if (pHead == null || k == 0) {
return;
}
// 周长
double girth = 0;
double x = pHead.getX();
double y = pHead.getY();
PointNode node = pHead.getNext();
// 计算周长
while (true) {
if (x == node.getX()) {
girth += Math.abs(node.getY() - y);
y = node.getY();
} else if (y == node.getY()) {
girth += Math.abs(node.getX() - x);
x = node.getX();
}
if (node.getNext() == null) {
girth += Math.abs(pHead.getY() - y) + Math.abs(pHead.getX() - x);
node.setNext(pHead);
break;
} else {
node = node.getNext();
}
}
System.out.println("周长为:" + girth);
// 看每段的长度
double preLength = girth / k;
// 等分点的起始坐标即终止坐标
PointNode tHead = new PointNode(pHead.getX(), pHead.getY());
node = pHead.getNext();
x = pHead.getX();
y = pHead.getY();
double mark = 0;
PointNode tTail = tHead;
while (node != null && tTail != null && k > 1) {
mark += Math.abs(node.getX() - x) + Math.abs(node.getY() - y);
while (mark >= preLength) {
// 多出来的部分
double diff = mark - preLength;
// 等分点的坐标
double thisX = x;
double thisY = y;
if (x == node.getX()) {
if (y > node.getY