题目

本题来自今天头条的笔试:
有一个n边形(P0, P1, ..., Pn), 每一条边皆为垂直或水平线段。现给定数值k,以P0为起点将n边形的周长分为k段,每段的长度相等,请打印出k等分点的坐标(T0, T1, ..., Tk)的坐标。

分析

1、可以计算出从第0个点,到第N个点的总距离,作为该点的一个属性保存。

2、那么第0个点的总距离即为该多版型周长

3、求出等分后每一段的长度d,那么等分的点到第0个点的距离肯定为d的整倍数。列举出d小于周长的整倍数。

4、遍历判断d整倍数所在的边。根据边的两个节点的大小关系,打印之。

Java实现

package com.algorithm;import com.google.common.collect.Lists;
import org.junit.Test;import java.util.ArrayList;/*** Author: 赵晓辉* MIS: zhaoxiaohui03* Date: 2019/3/26 15:46* Email: zhaoxiaohui03@meituan.com* Desc:今日头条面试题,多边形平分,打印平分点*/
public class TestAvgPointByJinRiTouTiao {@Testpublic void test() {ArrayList<Point> list = Lists.newArrayList();list.add(new Point(1, 1));list.add(new Point(1, 3));list.add(new Point(5, 3));list.add(new Point(5, 5));list.add(new Point(10, 5));list.add(new Point(10, 1));/*打印多少份*/int num = 13;/*总长度*/double sum = 0;/*计算从第0个点到当前点的总长度*/for (int i = 1; i < list.size(); i++) {/*当前点*/Point cur = list.get(i);/*上一个点*/Point last = list.get(i - 1);double length = distance(cur, last);/*计算长度*/cur.setSumLength(sum += length);}/*设置第0个点的总长度==周长*/list.get(0).setSumLength(sum += distance(list.get(0), list.get(list.size() - 1)));/*为计算方便,把第0个点加到list最后,这样list中有两个0号元素*/list.add(list.get(0));/*计算平均长度*/double avg = sum / num;System.out.println("总长度:" + sum);System.out.println("平均长度" + sum / num);/*平均长度的整倍数,即为等分点*/double[] avgArray = new double[num];for (int i = 0; i < num; i++) {avgArray[i] = (i + 1) * avg;}/*下一次开始比对的point的索引,这样避免不必要的比对*/int pointIndex = 1;for (int j = 0; j < num; j++) {double target = avgArray[j];for (int i = pointIndex; i < list.size(); i++) {Point cur = list.get(i);if (cur.getSumLength() > target) {double diff = cur.getSumLength() - target;Point pre = list.get(i - 1);/*水平线,当前点与上一个点Y坐标的大小关系不确定*/if (pre.getX() == cur.getX()) {if (pre.getY() < cur.getY()) {System.out.println("(" + cur.getX() + ",    " + (cur.getY() - diff) + ")");} else {System.out.println("(" + cur.getX() + ",    " + (cur.getY() + diff) + ")");}} else {/*垂直线,当前点与上一个点X坐标的大小关系不确定*/if (pre.getX() < cur.getX()) {System.out.println("(" + (cur.getX() - diff) + ",     " + cur.getY() + ")");} else {System.out.println("(" + (cur.getX() + diff) + ",     " + cur.getY() + ")");}}/*下一回从当前的点开始遍历扫描,*之所以不从下一个点开始,是因为有可能当前点和下一点中间存在多个要打印的点*/pointIndex = i;break;}}}}/*** 两个点的距离** @param p1* @param p2* @return*/public double distance(Point p1, Point p2) {return Math.pow(Math.pow(p1.getX() - p2.getX(), 2) + Math.pow(p1.getY() - p2.getY(), 2), 0.5);}class Point {int x;int y;/*从第0个点,到当前点的总长度* 第1个点总长度最小,* 第0个点总长度最大==周长*/double sumLength;Point(int x, int y) {this.x = x;this.y = y;}public int getX() {return x;}public void setX(int x) {this.x = x;}public int getY() {return y;}public void setY(int y) {this.y = y;}public double getSumLength() {return sumLength;}public void setSumLength(double sumLength) {this.sumLength = sumLength;}}
}

输出

总长度:26.0
平均长度2.0
(1.0,     3)
(3.0,     3)
(5,    3.0)
(5.0,     5)
(7.0,     5)
(9.0,     5)
(10,    4.0)
(10,    2.0)
(9.0,     1)
(7.0,     1)
(5.0,     1)
(3.0,     1)

求n边形周长的k等分点坐标(今日头条)相关推荐

  1. C语言学习之编程实现:输入长方形的两个边长a, b和一个整数k。k=1时,输出长方形的周长 l; k=2时 ,输出长方形的面积s;当k=3时 , 输出长方形的周长1和面积s

    C语言学习 编程实现:输入长方形的两个边长a, b和一个整数k.k=1时,输出长方形的周长 l; k=2时 ,输出长方形的面积s;当k=3时 , 输出长方形的周长1和面积s #include < ...

  2. pta-2、求三角形面积及周长 (10 分)

    2.求三角形面积及周长 (10 分) 输入的三角形的三条边a.b.c,计算并输出面积和周长.假设输入三角形三边是合法整形数据. 三角形面积计算公式: area=面积;perimeter=周长 ,其中s ...

  3. C++:求整数num中包含因子k的个数

    编写函数factors(num,k),函数功能是:求整数num中包含因子k的个数,如果没有该因子则返回0,例如:32=22222,则factors(32,2)=5.要求输入输出均在主函数中完成. #i ...

  4. [c]设计程序,输入一个圆柱体的半径r和高h,求圆柱体的底周长c、底面积s、侧面积s1、表面积s2和体积v。

    #include <stdio.h> //设计程序,输入一个圆柱体的半径r和高h,求圆柱体的底周长c.底面积s.侧面积s1.表面积s2和体积v. #define PI 3.14159265 ...

  5. c++ 求四边形面积和周长_C语言编程题 题目:任意输入4个点,求围成四边形的面积是多少?C语言编程题 题目:任意输入4...

    C语言编程题 题目:任意输入4个点,求围成四边形的面积是多少? C语言编程题 题目:任意输入4 www.zhiqu.org     时间: 2020-12-07 我测试过了,四点一线,凹四边形,四边形 ...

  6. c++ 求四边形面积和周长_面向对象c++——三角形求周长和面积

    这几天放假耍了几天,没有ACM题可贴,就只有贴作业了,很水的作品请指教 源代码: /*************************************** c++编程题 定义一个三角形类求三角 ...

  7. C语言:输入三角形的边长,求出三角形的周长,面积和,若不能构成,则提示出来,

    //3.输入三角形的边长,求出三角形的周长,面积和,若不能构成,则提示出来, #include <stdio.h> #include <math.h> int main(int ...

  8. 定义一个三角形类Ctriangle,求三角形面积和周长。

    /*定义一个三角形类Ctriangle,求三角形面积和周长.若这三边无法组成一个三角形则不用计算就退出.*/ #include<iostream> #include<cmath> ...

  9. c程序设计:输入长方形的高和宽,求该长方形的周长和面积

    c程序设计:输入长方形的高和宽,求该长方形的周长和面积 #include <stdio.h> int main() {float a,b,c,s;printf("请输入长和宽:& ...

最新文章

  1. Loj#3077-「2019 集训队互测 Day 4」绝目编诗【结论,虚树,鸽笼原理】
  2. B程序员:讲述三年计算机学习辛酸史
  3. HTML五合一收款码网站源码(带35套模板)
  4. requests模块报错:Use body.encode('utf-8') if you want to send it encoded in UTF-8.
  5. 20 周年特别策划 | 说出你与 CSDN 的故事!
  6. Oracle表删除大量数据后查询变慢问题
  7. 运行uiautomatorviewer.bat报错No suitable Java found
  8. C语言学生档案表设计——作业
  9. 用excel制作双层饼图_Excel做的双层饼图,太漂亮了
  10. 樊登读书会掌控读后感_樊登读书刻意练习读后感
  11. Android中的Drawable(一)
  12. 小白学JAVA之十——枚举
  13. HTTPS 和 SSL/TLS 协议:密钥交换(密钥协商)算法及其原理
  14. 使用OpenVINO实现飞桨版PGNet推理程序
  15. 计算机文化基础第二次作业-简答题,中传2018年秋计算机文化基础第二次作业-简答题...
  16. 段间转移、长调用、短调用
  17. 树莓派4B开机自启动Python程序,发送WIFI-IP至指定邮箱
  18. 软件项目管理第二篇:项目计划 (1)——范围计划
  19. IBM DS3000存储DS3400数据恢复成功案例记录
  20. 光学单位定义-照度 lux

热门文章

  1. https://wenku.baidu.com/view/35c88b375acfa1c7aa00ccca.html--swot
  2. nmn是真的还是假的,如何鉴别高质量的nmn,方法一览
  3. php msvcr110,安装PHP时计算机错误丢失了msvcr110.dll
  4. 计算机安装msvcr110.dll,帮您还原win7系统运行程序提示计算机中丢失msvcr110.dll的解决方法...
  5. 各版本Qt下载传送门
  6. 一些计算机模拟人脑项目
  7. 查询至少具有两份工作员工的姓名和其公司名
  8. 中新社、新华报业网等媒体报道腾云忆想云化IT生态,聚焦科技助力“双循环经济”数字化升级
  9. 重心法-判断一点是否在三角形内
  10. GIS添加图层、查询详细