面试经典150题——文本左右对齐(困难)

news2025/1/18 4:49:26

​"It always seems impossible until it’s done."

- Nelson Mandela

1. 题目描述:

这个题目标为困难题目,但是如果我们静下心来把题目读懂了,其实无非就是不同情况下不同考虑而已,也没什么思维上的复杂,还比不上我们上一篇文章讲的KMP算法烧脑。

2. 题目分析与解析

解题思路:其实用下面一张流程图就可以很好的理解并做出该题。

其实就是一系列的情况的分类而已,并没有太复杂。

3.代码实现

首先我们来实现主循环部分,我就直接把注释写在代码里了。

public List<String> fullJustify(String[] words, int maxWidth) {
    // 记录总的结果
    ArrayList<String> ret = new ArrayList<>();
    // 记录当前行的单词
    ArrayList<String> lineRet = new ArrayList<>();
    // 记录当前行的字符串长度
    int len = 0;
    // 记录当前行有多少个单词
    int wordCount = 0;
    // 开始遍历每个单词
    for (int i = 0; i < words.length; i++) {
        String word = words[i];
        // +1是因为要保证每一个单词后有至少要有一个空格
        int strLen = word.length() + 1;
        // 加入当前行的总长
        len += strLen;
        // 可以放入当前行(len-1是因为一行的最后一个单词后没有空格)
        if (len - 1 <= maxWidth) {
            //当是最后一行
            if (i == words.length - 1) {
                StringBuilder lastLine = new StringBuilder();
                // 最后一行的单词之间只有一个空格,末尾要加空格
                for (String item : lineRet) {
                    lastLine.append(item).append(" ");
                }
                // 加上当前单词
                lastLine.append(word);
                // 补充结尾空格
                for (int j = lastLine.length(); j < maxWidth; j++) {
                    lastLine.append(" ");
                }
                ret.add(lastLine.toString());
            // 不是最后一行
            } else {
                lineRet.add(word);
                wordCount++;
            }
        // 放不下当前行
        } else {
            // 如果只有一个单词,左对齐
            if (wordCount == 1) {
                // 计算要补上的空格数
                int spaceLen = maxWidth - lineRet.get(0).length();
                StringBuilder sb = new StringBuilder();
                // 补上空格
                for (int j = 0; j < spaceLen; j++) {
                    sb.append(" ");
                }
                String spaces = sb.toString();
                ret.add(lineRet.get(0) + spaces);
                
            // 如果包含很多个单词,那就左右对齐,同时保证空格数尽量平均,且左边更多
            } else {
                // 改行总共应该有多少个空格
                int spaceCount = maxWidth - len + strLen + wordCount;
                // 包装函数获取左右对齐的字符串,sb即为当前行结果
                StringBuilder sb = getSb(spaceCount, wordCount, lineRet);
                ret.add(sb.toString());
            }
            // 清0
            lineRet.clear();
            len = 0;
            wordCount = 0;
            i--;
        }
    }
    return ret;
}

现在我们来看一下对于包含很多个单词,左右对齐,同时保证空格数尽量平均,且左边更多的过程的函数getSb(spaceCount, wordCount, lineRet)。

	/**
     * 获取左右对齐的字符串
     *
     * @param spaceCount 总共的空格数
     * @param wordCount  当前行单词数
     * @param lineRet    当前行的单词
     * @return 左右对齐的字符串
     */
private static StringBuilder getSb(int spaceCount, int wordCount, ArrayList<String> lineRet) {
    // 计算每个间隔平均放几个空格
    int space = spaceCount / (wordCount - 1);
    // 多余的空格
    int extraSpace = spaceCount % (wordCount - 1);
    StringBuilder sb = new StringBuilder();
    for (int j = 0; j < lineRet.size(); j++) {
        sb.append(lineRet.get(j));
        // 最后一个单词后不加空格
        if (j != lineRet.size() - 1) {
            for (int k = 0; k < space; k++) {
                sb.append(" ");
            }
            // 每一次进来就相当于从左到右加一个多余的空格,那么我左边肯定比右边空格多
            if (extraSpace > 0) {
                sb.append(" ");
                extraSpace--;
            }
        }
    }
    return sb;
}

好了代码到这就完成了,是不是很easy?遇到困难题不要慌,没准就是吓唬吓唬你!

4. 运行结果

当然还有很大的优化空间,但是思路是正确的,我看了下官方思路也是相同的,优化的话就是很多for循环是不必要的,可以用join函数实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1432324.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ainx框架实现 一

&#x1f4d5;作者简介&#xff1a; 过去日记&#xff0c;致力于Java、GoLang,Rust等多种编程语言&#xff0c;热爱技术&#xff0c;喜欢游戏的博主。 &#x1f4d7;本文收录于Ainx系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏Rust初阶教程、go语言基础系列…

对话 Zeitgeist|巧借波卡生态优势,开启去中心化预测市场新篇章

在纷繁芜杂的信息世界里&#xff0c;真相和事实往往是稀缺品&#xff0c;利用预测市场的激励方式往往能够带领我们前瞻未来发展的趋势&#xff0c;走向获得真理和进步的 Web3 新世界。—— Zeitgeist 团队 试想下&#xff0c;如果有一天&#xff0c;你可以自由地在感兴趣的行业…

【经典项目】Java小游戏 —— 会说话的汤姆猫

一、游戏回顾 【预期效果】 【玩法介绍】 1、 和它说话&#xff0c;它将用有趣的声音重复你的话。 2、打它的头&#xff0c;它会装成被打的样子&#xff0c;连续打还会晕倒&#xff1b;抚摸肚子&#xff0c;它会打呼噜&#xff1b;打肚子&#xff0c;它会装肚子疼&#xff1b…

QUIC with CUBIC or BBR

拥塞控制 拥塞控制算法是 TCP/QUIC 协议的一个基础部分&#xff0c;多年来经过一个个版本的迭代&#xff08;如 Tahoe、Reno、Vegas 等&#xff09;&#xff0c;拥塞控制算法得到了持续的提升。由于篇幅有限&#xff0c;本文就目前比较流行的两种拥塞控制算法&#xff08;CUBI…

[AIGC] 21世纪Java与Go的相爱相杀

在21世纪的软件开发领域中&#xff0c;Java和Go这两门编程语言可谓是相爱相杀的存在。它们各自拥有着强大的特点和独特的优势&#xff0c;同时也存在着一些明显的竞争和冲突。让我们来看看这两门语言的故事&#xff0c;以及它们之间的深远意义。 文章目录 Java的魅力Go的魅力相…

以小猪o2o生活通v17.1为例简要分析SWOOLE加密破解,swoole_loader加密破解swoole加密逆向后的代码修复流程(个人见解高手掠过)

现在用Php加密五花八门除了组件就是混淆&#xff0c;在组件里面响当当的还属swoole&#xff0c;SWOOLEC是不错的国产加密&#xff0c;值得推荐官方宣称是永远无法破解的加密算法&#xff0c;针对swoole compiler的代码修复我谈谈我的看法&#xff0c;以小猪o2o生活通&#xff0…

一、Redis之NoSQL

1.1 什么是NoSQL NoSQL&#xff08;Not Only SQL&#xff09;即不仅仅是SQL&#xff0c;泛指非关系型的数据库&#xff0c;它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起&#xff0c;非关系型的数据库现在成了一个极其热门的新领域&#xff0c;非关系数据库产…

Scrapy:Python中强大的网络爬虫框架

Scrapy&#xff1a;Python中强大的网络爬虫框架 在当今信息爆炸的时代&#xff0c;从互联网上获取数据已经成为许多应用程序的核心需求。Scrapy是一款基于Python的强大网络爬虫框架&#xff0c;它提供了一种灵活且高效的方式来提取、处理和存储互联网上的数据。本文将介绍Scrap…

fastjson 导致的OOM

fastjson 导致的OOM 示例代码 public static void main(String[] args) throws Exception {try {List<Integer> list JSONObject.parseArray("[2023,2024", Integer.class);}catch (Exception e){System.err.println("error");}System.out.println…

Linux 驱动开发基础知识——设备树的语法驱动开发基础知识(九)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;Vir2021GKBS &#x1f43c;本文由…

Vue3_基础使用_1

这节主要介绍&#xff1a; vue2与vue3的区别&#xff0c;创建响应式的数据&#xff0c;setup语法糖的使用&#xff0c;watch监听&#xff0c;及vue3创建项目。 vue2的选项式与vue3的组合式区别&#xff1a; 选项式&#xff1a;vue2中数据与方法计算属性等等&#xff0c;针对…

《Python 网络爬虫简易速速上手小册》第4章:Python 网络爬虫数据抓取技术(2024 最新版)

文章目录 4.1 解析 HTML 与 CSS4.1.1 重点基础知识讲解4.1.2 重点案例&#xff1a;使用 BeautifulSoup 解析博客文章4.1.3 拓展案例 1&#xff1a;使用 lxml 和 XPath 解析产品信息4.1.4 拓展案例 2&#xff1a;动态加载内容的抓取挑战 4.2 动态内容抓取技术4.2.1 重点基础知识…

时间序列预测——GRU模型

时间序列预测——GRU模型 在深度学习领域&#xff0c;循环神经网络&#xff08;RNN&#xff09;是处理时间序列数据的一种常见选择。上期已介绍了LSTM的单步和多步预测。本文将深入介绍一种LSTM变体——门控循环单元&#xff08;GRU&#xff09;模型&#xff0c;包括其理论基础…

ArcGIS Pro 按照字段进行融合或拆分

ArcGIS Pro 按字段融合 在ArcGIS Pro中&#xff0c;通过使用“融合”工具可以轻松地合并具有相同字段的图层。 步骤一&#xff1a;打开ArcGIS Pro 启动ArcGIS Pro应用程序&#xff0c;确保您已经登录并打开您的项目。 步骤二&#xff1a;添加图层 将包含相同字段的图层添加到…

【C++】C++入门 — 类和对象初步介绍

类和对象 1 类的作用域2 类的实例化3 类对象模型4 this指针介绍&#xff1a;特性&#xff1a; Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读&#xff01;下一篇文章见&#xff01;&#xff01;&#xff01; 1 类的作用域 类定义了一个新的作用域&#xff0c;类的…

项目安全问题及解决方法-----xss处理

XSS 问题的根源在于&#xff0c;原本是让用户传入或输入正常数据的地方&#xff0c;被黑客替换为了 JavaScript 脚本&#xff0c;页面没有经过转义直接显示了这个数据&#xff0c;然后脚本就被 执行了。更严重的是&#xff0c;脚本没有经过转义就保存到了数据库中&#xff0c;随…

Redis之基础篇

Redis简介 Redis是一种基于键值对&#xff08;Key-Value&#xff09;的NoSQL数据库&#xff0c;它支持string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xff09;、set&#xff08;集合&#xff09;、zset&#xff08;有序集…

matplotlib-中文乱码问题解决方案

前言 本文主要解决matplotlib在画图时&#xff0c;出现的中文乱码问题&#xff0c;具体问题示意如下&#xff1a; 下面将针对这个问题直接给出具体的解决步骤。 具体步骤 1、首先去网上下载并安装SimHei字体&#xff0c;其它字体也行&#xff0c;如下 并将它安装在此目录下…

面试150 位1的个数 位运算

Problem: 191. 位1的个数 文章目录 思路复杂度Code 思路 &#x1f468;‍&#x1f3eb; 参考 复杂度 Code public class Solution {// you need to treat n as an unsigned valuepublic int hammingWeight(int n){int res 0;while (n ! 0){res 1;n & n - 1;// 把最后…

海康IPC摄像机接入国标平台,发现一直不在线(离线)的处理方式

目 录 一、问题 二、问题分析 &#xff08;一&#xff09;常见设备离线问题的原因 &#xff08;二&#xff09;原因分析 三、问题查处 &#xff08;一&#xff09;设备端排查故障&#xff08;设备端自查&#xff09; 1、检查GB28181参数配置是否有误 2、…