题目

本题来自今天头条的笔试:

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

分析

首先,假设n边形在二维平面的上,每个顶点具有X坐标和Y坐标。

其次,n边形的边具有特殊的性质,每条边皆为垂直或水平线段。因此,如果我们计算线段长度时,可以通过线段端点的X坐标或Y坐标相减得到。

最后,由于需要计算n边形周长和等分点坐标,这需要计算两个相邻点的距离,考虑到这个特性,我们可以采用线性结构来进行存储。

接下来我们分析一下具体实现。

Java实现

首先我们来实现表示n边形顶点坐标的类:

public class Coordinate {private double x, y;public Coordinate(double x, double y) {super();this.x = x;this.y = y;}public double getX() {return x;}public void setX(double x) {this.x = x;}public double getY() {return y;}public void setY(double y) {this.y = y;}@Overridepublic String toString() {return "x = " + x + ", y=" + y;}
}

下面是n边形的实现类:

public class Polygon {private Coordinate[] coArray = null;public Polygon(Coordinate[] array) {coArray = array;}/*** 计算多边形边长* * @return*/public double getPerimeter() {double perimeter = 0;for (int i = 0; i < coArray.length; i++) {int next = i + 1;// 如果最后一个顶点的话,需要计算和起点的距离if (i == coArray.length - 1) {next = 0;}// 计算每条边的边长if (coArray[i].getX() == coArray[next].getX()) {perimeter += Math.abs(coArray[i].getY() - coArray[next].getY());} else {perimeter += Math.abs(coArray[i].getX() - coArray[next].getX());}}return perimeter;}public Coordinate[] getKDivid(int k) {double perimeter = getPerimeter();double divLen = perimeter / k;double len = divLen;Coordinate[] coordinates = new Coordinate[k];int index = 0;for (int i = 0; i < coArray.length; i++) {int next = i + 1;// 如果最后一个顶点的话,需要计算和起点的距离if (i == coArray.length - 1) {next = 0;}//判断当前的边是垂直还是水平方向if (coArray[i].getX() == coArray[next].getX()) {double distance = Math.abs(coArray[i].getY() - coArray[next].getY());if (len < distance) {//当前边上存在k等分点,而且存在多个的情况//用来记录距离当前线段起点距离double base = 0;while (len <= distance) {if (coArray[i].getY() > coArray[next].getY()) {coordinates[index] = new Coordinate(coArray[i].getX(), coArray[i].getY() - (len + base));} else {coordinates[index] = new Coordinate(coArray[i].getX(), coArray[i].getY() + (len + base));}base += len;                     distance -= len;len = divLen;index++;}//len记录了当前边计算完k等分点后还剩余多长len = divLen - distance;} else {len -= distance;}} else { //处理垂直方向的情况double distance = Math.abs(coArray[i].getX() - coArray[next].getX());if (len < distance) {double base = 0;while (len <= distance) {if (coArray[i].getX() > coArray[next].getX()) {coordinates[index] = new Coordinate(coArray[i].getX() - (len + base), coArray[i].getY());} else {coordinates[index] = new Coordinate(coArray[i].getX() + (len + base), coArray[i].getY());}base += len;index++;distance -= len;len = divLen;}len = divLen - distance;} else {len -= distance;}}}return coordinates;}
}

实现上有几个技巧:

1. 由于n边形采用了线性数组的存储结构,在计算周长和k等分点的函数中,处理最后一条边时,需要计算数组最后一个节点和第一个节点的距离。我们使用了一个next索引变量来记录下一个索引的位置,如果是最后一个节点,则下一个节点为第一个节点。

2. 在计算k等分点时,需要区分水平线段还是垂直线段,这个影响到坐标的计算;另外需要考虑的时,可能存在一个线段上存在多个等分点的情况。

单元测试

设计一些测试用例来计算K等分点,这块需要注意的是K等分点计算机浮点数表示可能和你手工计算出来的不同,需要做一下处理。

Java算法面试题(005) 求n边形周长的k等分点坐标(今日头条)相关推荐

  1. 求n边形周长的k等分点坐标(今日头条)

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

  2. Java算法面试题(007) 蒙提霍尔问题(三门问题)

    简介 此问题本身和算法无关,本质上一个关于概率的问题,在一些高等级的面试也经常被问及,因此收录在Java算法面试题系列中. 三门问题(Monty Hall problem)亦称为蒙提霍尔问题.蒙特霍问 ...

  3. 记一道超级简单的 Java 算法面试题,但无人通过

    点击上方蓝字设为星标 下面开始今天的学习- 作者:方志宏(已获作者授权转载,禁止二次转载) 来源:https://zhuanlan.zhihu.com/p/57859872 这可能是历史上最简单的一道 ...

  4. java算法面试题_【干货】经典算法面试题代码实现-Java版

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 面试题3:二维数组中的查找 题目描述:一个二维数组,每一行从左到右递增,每一列从上到下递增.输入一个二维数组和一个整数,判断数组中是否含有整数. publ ...

  5. Java算法面试题:编写一个程序,将e:\neck目录下的所有.java文件复制到e:\jpg目录下,并将原来文件的扩展名从.java改为.jpg...

    package com.swift;import java.io.File; import java.io.FileFilter; import java.io.FileInputStream; im ...

  6. Java算法面试题 一个顺子带一对

    打牌里面经常出现的5张牌,一个顺子带一对,给你五张牌,比如:1,2,2,2,3 或者 5,6,7,4,4 或者 2,4,3,5,5 或者 7,5,9,6,9 ,这种情况就符合一个顺子带一对,则返回 t ...

  7. 记一道超级简单的算法面试题,90%的人没能完整答出来

    作者:方志宏(已获作者授权转载,禁止二次转载) 来源:https://zhuanlan.zhihu.com/p/57859872 这可能是历史上最简单的一道 Java 算法面试题了. 题目很简单,完成 ...

  8. java面笔试_java笔试手写算法面试题大全含答案

    java笔试手写算法面试题大全含答案 1.统计一篇英文文章单词个数. public class WordCounting { public static void main(String[] args ...

  9. twitter java_Twitter算法面试题详解(Java实现)

    最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...

  10. java常见算法面试题

    java常见算法面试题 Java的冒泡排序,快速排序,归并排序,计数排序,二分查找法 1.斐波那契数列 1.斐波那契数列又叫黄金分割和兔子数列 :1.1.2.3.5.8.13.21.34.-- 在数学 ...

最新文章

  1. 本地运行github上的vue2.0仿饿了么webapp项目
  2. slider(滑动条)控件模版,样式--用图片定义控件模版
  3. 基于OCR的字母识别算法的matlab仿真
  4. win10 docker desktop无法拉取镜像解决办法
  5. 八皇后问题python实现_八皇后问题的python实现
  6. JavaScript中的坐标
  7. 登录:应用程序错误通知
  8. 使用 Flomesh 强化 Spring Cloud 服务治理
  9. Split Byte(文件分割助手) v2.4
  10. 使用zabbix发送邮件的简易设置流程(存档用)
  11. XMLHttpRequest2 异步 ajax
  12. jquery字符串转json
  13. marlab中主成分得分怎么求_数学无耻得分法,独家秘密,快点用起来
  14. Camera Tuning-高通平台总结
  15. 麻将算法(二)牌型转换以及接牌
  16. 用Asp.net 就能轻松实现铁道部的订票系统
  17. 夏季养生:夏季养生必备五种中药材
  18. CrateDB三机三节点部署(Docker Overlay网络)
  19. 简易的web全栈开发——服务器部分
  20. 高并发基础之Java并发包

热门文章

  1. android交叉编译libxml2,libxml2 ARM 交叉编译
  2. win10PE安装到硬盘
  3. excel培训机构_不会excel的,不是好地产人
  4. excel一列求和_学会这15组Excel函数,解决数据分析中80%的难题
  5. matlab半峰宽计算公式,半峰宽单位换算(峰宽与半峰宽转换公式)
  6. 国内外计算机专业图形图像处理课程现状,计算机图像处理论文
  7. 互动媒体技术专题2——多视角认识十二个“一” 技术预演与方案设计
  8. 在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具
  9. 联想 M7400 两种清零方法
  10. 使用Postman进行get、put、post端口测试