求n边形周长的k等分点坐标(今日头条)
题目
本题来自今天头条的笔试:
有一个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等分点坐标(今日头条)相关推荐
- 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 < ...
- pta-2、求三角形面积及周长 (10 分)
2.求三角形面积及周长 (10 分) 输入的三角形的三条边a.b.c,计算并输出面积和周长.假设输入三角形三边是合法整形数据. 三角形面积计算公式: area=面积;perimeter=周长 ,其中s ...
- C++:求整数num中包含因子k的个数
编写函数factors(num,k),函数功能是:求整数num中包含因子k的个数,如果没有该因子则返回0,例如:32=22222,则factors(32,2)=5.要求输入输出均在主函数中完成. #i ...
- [c]设计程序,输入一个圆柱体的半径r和高h,求圆柱体的底周长c、底面积s、侧面积s1、表面积s2和体积v。
#include <stdio.h> //设计程序,输入一个圆柱体的半径r和高h,求圆柱体的底周长c.底面积s.侧面积s1.表面积s2和体积v. #define PI 3.14159265 ...
- c++ 求四边形面积和周长_C语言编程题 题目:任意输入4个点,求围成四边形的面积是多少?C语言编程题 题目:任意输入4...
C语言编程题 题目:任意输入4个点,求围成四边形的面积是多少? C语言编程题 题目:任意输入4 www.zhiqu.org 时间: 2020-12-07 我测试过了,四点一线,凹四边形,四边形 ...
- c++ 求四边形面积和周长_面向对象c++——三角形求周长和面积
这几天放假耍了几天,没有ACM题可贴,就只有贴作业了,很水的作品请指教 源代码: /*************************************** c++编程题 定义一个三角形类求三角 ...
- C语言:输入三角形的边长,求出三角形的周长,面积和,若不能构成,则提示出来,
//3.输入三角形的边长,求出三角形的周长,面积和,若不能构成,则提示出来, #include <stdio.h> #include <math.h> int main(int ...
- 定义一个三角形类Ctriangle,求三角形面积和周长。
/*定义一个三角形类Ctriangle,求三角形面积和周长.若这三边无法组成一个三角形则不用计算就退出.*/ #include<iostream> #include<cmath> ...
- c程序设计:输入长方形的高和宽,求该长方形的周长和面积
c程序设计:输入长方形的高和宽,求该长方形的周长和面积 #include <stdio.h> int main() {float a,b,c,s;printf("请输入长和宽:& ...
最新文章
- Loj#3077-「2019 集训队互测 Day 4」绝目编诗【结论,虚树,鸽笼原理】
- B程序员:讲述三年计算机学习辛酸史
- HTML五合一收款码网站源码(带35套模板)
- requests模块报错:Use body.encode('utf-8') if you want to send it encoded in UTF-8.
- 20 周年特别策划 | 说出你与 CSDN 的故事!
- Oracle表删除大量数据后查询变慢问题
- 运行uiautomatorviewer.bat报错No suitable Java found
- C语言学生档案表设计——作业
- 用excel制作双层饼图_Excel做的双层饼图,太漂亮了
- 樊登读书会掌控读后感_樊登读书刻意练习读后感
- Android中的Drawable(一)
- 小白学JAVA之十——枚举
- HTTPS 和 SSL/TLS 协议:密钥交换(密钥协商)算法及其原理
- 使用OpenVINO实现飞桨版PGNet推理程序
- 计算机文化基础第二次作业-简答题,中传2018年秋计算机文化基础第二次作业-简答题...
- 段间转移、长调用、短调用
- 树莓派4B开机自启动Python程序,发送WIFI-IP至指定邮箱
- 软件项目管理第二篇:项目计划 (1)——范围计划
- IBM DS3000存储DS3400数据恢复成功案例记录
- 光学单位定义-照度 lux
热门文章
- https://wenku.baidu.com/view/35c88b375acfa1c7aa00ccca.html--swot
- nmn是真的还是假的,如何鉴别高质量的nmn,方法一览
- php msvcr110,安装PHP时计算机错误丢失了msvcr110.dll
- 计算机安装msvcr110.dll,帮您还原win7系统运行程序提示计算机中丢失msvcr110.dll的解决方法...
- 各版本Qt下载传送门
- 一些计算机模拟人脑项目
- 查询至少具有两份工作员工的姓名和其公司名
- 中新社、新华报业网等媒体报道腾云忆想云化IT生态,聚焦科技助力“双循环经济”数字化升级
- 重心法-判断一点是否在三角形内
- GIS添加图层、查询详细