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

2023-11-17

题目

本题来自今天头条的笔试:
有一个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 {

    @Test
    public 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)

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • “ModuleNotFoundError: No module named sklearn”解决办法

    最近在跑实验的时候 需要导入sklearn 但是运行代码一直提示 ModuleNotFoundError No module named sklearn 实验中导入sklearn的代码 from sklearn import metrics
  • Linux CentOS7 中 完美解决VMTools失效,windows 与 Liunx间完美复制文件,无报错的解决方案

    问题 我也是才刚使用CentOS7没多久 搭建好环境后出现比较头疼的问题就是 Windows 和 Linux 之间无法复制粘贴文本和文件 这个问题只要在虚拟机中安装 VMTools 就能解决 但是不知道什么原因导致 我在CentOS 6 8
  • Linux 狂神说学习笔记

    狂神说linux Linux 基本目录 目录相关命令 文件属性 查看文件 硬链接和软链接 vim 账号管理 用户组管理 磁盘管理 进程管理 环境安装 基本目录 目录相关命令 ls al 列出目录 a所有文件包括隐藏文件 l列出所有文件包括文
  • MyBatis ognl.NoSuchPropertyException 或者 Invalid bound statement (not found)

    描述 SpringBoot Mybatis plus 项目 运行时出现如下错误 ognl NoSuchPropertyException 没有对应属性异常 Invalid bound statement not found 绑定语句无效 未
  • 问题小结(3)-dialog标题居中

    dialog标题居中问题 用系统的AlertDialog Builder创建dialog时 如果需要将dialog的title居中显示 需要调用 setCustomTitle View view 方法 对需要设置的view设置居中的相关属性
  • zookeeper 分布式共享锁的流程图

    1分布式共享锁的流程图 原理 package cn itcast bigdata zklock import java util Collections import java util List import java util Rand
  • 水球图 及各种参数设置

    水球图 Liquid Fill Chart 是Echarts的一个插件 在官方文档中没有 可以用来优雅的展示百分比数据 水球图 gif 安装 HTML中引入水球图
  • docker基础1——架构组成、安装配置

    文章目录 一 发展起源 1 1 传统虚拟化与容器虚拟化 1 2 docker底层核心技术 1 2 1 命名空间 1 2 2 控制组 1 3 docker工作方式 1 4 docker容器编排 1 5 docker优劣势 1 6 docker
  • iframe的替代品

    面试题 使用过iframe框架 那你对于iframe框架的优缺点知道多少 并且由于iframe的一些缺点 国内外针对这个框架的替代品你知道有哪些呢 知识点1 iframe框架的优缺点 优点 1 可以跨域请求其他网站 并将网站完整展示出来 2
  • [课程复习] 数据结构之线性表、树、图、查找、排序经典算法复习

    作者最近在复习考博 乘此机会分享一些计算机科学与技术 软件工程等相关专业课程考题 一方面分享给考研 考博 找工作的博友 另一方面也是自己今后完成这些课程的复习资料 同时也是在线笔记 基础知识 希望对您有所帮助 不喜勿喷 无知 乐观 低调 谦
  • 【Qt Modbus通信】QModbus实现modbus的主机功能 源码分享

    前言 modbus在上下位机数据交互时被广泛使用 因此写了这篇笔记和大家一起学习 Qt Modbus通信 libmodbus实现modbus的主机功能 从机功能 源码分享 之前使用libmodbus实现了modbus的主从功能 但发现主机查
  • docker frp 搭建内网穿透

    docker frp 搭建内网穿透 可运行的云服务器 docker pull snowdreamtech frps mkdir p root docker frp cd root docker frp touch frps ini comm
  • 企业微信如何简单实现定时发送文件到群:企业微信群机器人操作(Java代码实现)

    前言 不知道小伙伴们的公司组织架构通勤用的啥软件 我公司用的企业微信 然后业务销售部那边需要每天统计销售数据报表然后发在群里 我是开发 我不配在群里 知道这个背景以后 产品给我们的需求是 直接统计数据按照业务那边的报表模板直接生成销售报表
  • ARM-A架构入门基础(三)MMU

    14天学习训练营导师课程 周贺贺 ARMv8 ARMv9架构 快速入门 1 MMU Memory Management Unit 内存管理单元 MMU的意义在于将软件程序的虚拟地址转换为真实的物理地址 2 MMU种类 Secure EL1
  • 数据结构——图解循环队列长度计算问题

    队列定义是这样的 define MAXSIZE 10 typedef struct ElemType data MAXSIZE int front rear SeqQueue 一个队列 一个存放元素的数组 一个队头指针 一个队尾指针 fro
  • np.array与list的内存大小比较

    1 np array与list 比较 a 1 2 3 4 需要4个指针和四个数据 增加了存储和消耗cpu a np array 1 2 3 4 只需要存放四个数据 读取和计算更加方便 2 np array与list所占内存 def test
  • sqlserver语言转mysql_SQLSERVER 脚本转MYSQL 脚本的方法总结

    标签 1 MYSQL中SQL脚步都要以分号 结尾 这点比SQLSERVER要严谨 2 所有关键字都要加上 比如 Status 替换成 Status 按是有个 的键 3 SQLSERVER的dbo 在mysql中不支持 都要去掉 4 isnu
  • java field static_Java基础之关键字static

    static是Java中的一个关键字 用来修饰成员变量与成员方法 还可以用于编写静态代码块 对于被static修饰的东西 JVM在加载类的时候 就给这些变量在内存中分配了一定的空间 即在编译阶段时就为这些成员变量的实例分配了空间 一 静态变
  • 机器学习入门之流浪地球

    机器学习入门之流浪地球 1 引言 2 问题描述 3 问题分析 4 问题求解 4 1 数据集 4 2 模型构造 4 3 损失函数 4 4 梯度下降 4 5 模型训练 4 6 预测 4 7 完整实现代码 5 总结与思考 1 引言 我国里程碑式科
  • 求n边形周长的k等分点坐标(今日头条)

    题目 本题来自今天头条的笔试 有一个n边形 P0 P1 Pn 每一条边皆为垂直或水平线段 现给定数值k 以P0为起点将n边形的周长分为k段 每段的长度相等 请打印出k等分点的坐标 T0 T1 Tk 的坐标 分析 1 可以计算出从第0个点 到