网上看到了一张字节跳动的编码题试卷,试着做了一下,记录一下

本文记录了作者尝试解决字节跳动编程笔试题的体验,涉及链表操作和数组计算问题。第一题通过求周长和等分找到链表等分点;第二题通过反转链表实现链表加法;第三题解决积水问题,利用递归分析数组积水区域。期待读者分享更优解法。
摘要由CSDN通过智能技术生成

最近在网上无意间看到了一张字节跳动的编程笔试题,试着做了做,发现做法可能稍显臃肿了,发出来看看哪位大神给指点一下,看看怎么做可以更简洁高效;

试卷如下:
在这里插入图片描述

第一题

思路:将每个点看成是链表的一个节点,先求出周长,再等分,然后遍历链表节点,寻找等分点,保存在新链表中,注意等分份数;

/**
 * @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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值