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

​"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());}// 清0lineRet.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.mzph.cn/news/668768.shtml

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

相关文章

Linux openKylin(开放麒麟)系统SSH服务安装配置与公网远程连接

文章目录 前言1. 安装SSH服务2. 本地SSH连接测试3. openKylin安装Cpolar4. 配置 SSH公网地址5. 公网远程SSH连接6. 固定SSH公网地址7. SSH固定地址连接8. 结语 前言 openKylin是中国首个基于Linux 的桌面操作系统开发者平台&#xff0c;通过开放操作系统源代码的方式&#xff…

C++:第十五讲高精度算法

每日C知识 system("color xx);是改变字体及背景颜色&#xff0c;前一个x代表一个数字&#xff0c;可以改变背景颜色&#xff0c;后一个x代表一个数字&#xff0c;可以改变字体颜色 &#xff0c;但都是根据颜色表来的。 记住&#xff1a;要加头文件&#xff1a;#include&l…

综合分享1

VM及安装配置windows server 2008 1&#xff09;安装配置VM 确保是否正确安装&#xff1a; 1&#xff09;检查本地“网络与internal设置”中的虚拟网卡是否创建成功&#xff08;vmnet1和vmnet8&#xff09; 2&#xff09;必须通过services.msc查看vmware的所有是否已经…

手写分布式存储系统v0.3版本

引言 承接 手写分布式存储系统v0.2版本 &#xff0c;今天开始新的迭代开发。主要实现 服务发现功能 一、什么是服务发现 由于咱们的服务是分布式的&#xff0c;那从服务管理的角度来看肯定是要有一个机制来知道具体都有哪些实例可以提供服务。举个例子就是&#xff0c;张三家…

DevOps落地笔记-07|案例分析:如何有效管理第三方组件

上一讲主要介绍了如何通过代码预检查的方式提高入库代码的质量&#xff0c;将代码检查尽可能前置&#xff0c;降低修复问题的成本&#xff0c;从而提高交付软件的质量。除了代码本身的问题&#xff0c;依赖组件也是经常困扰开发者的一个问题。比如&#xff0c;依赖组件的某个版…

认识Tomcat (一)

认识Tomcat &#xff08;一&#xff09; 一、服务器 1.1 服务器简介 ​ 硬件服务器的构成与一般的PC比较相似&#xff0c;但是服务器在稳定性、安全性、性能等方面都要求更高&#xff0c;因为CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。 ​ 软件服务器&…

深度学习(生成式模型)—— Consistency Models

文章目录 前言预备知识&#xff1a;SDE与ODEMethod实验结果 前言 Diffusion model需要多次推断才能生成最终的图像&#xff0c;这将耗费大量的计算资源。前几篇博客我们已经介绍了加速Diffusion model生成图像速率的DDIM和Stable Diffusion&#xff0c;本节将介绍最近大火的Co…

【Matplotlib】figure方法 你真的会了吗!?

&#x1f388;个人主页&#xff1a;甜美的江 &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;matplotlib &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

前端工程化之:webpack2-1(常用扩展)

目录 前言 一、CleanWebpackPlugin 二、HtmlWebpackPlugin 三、CopyPlugin 四、webpack-dev-server 五 、file-loader 六、url-loader 七、路径问题 前言 由于 webpack 、 webpack-cli 、 webpack-dev-server 会存在版本不兼容问题&#xff0c;所以这里使用的版本如下&…

设计模式全览:编程艺术的精髓!

写在前面 请心急的读者直接看往后看「设计模式精炼」&#xff01;一定不会后悔的&#xff01; 在编程世界中&#xff0c;设计模式如同优雅的舞者&#xff0c;缠绕在代码的脉络中&#xff0c;引领着程序走向卓越。设计模式解决的是软件开发中经常出现的问题&#xff0c;他们如同…

解放双手!ChatGPT助力编写JAVA框架!

摘要 本文介绍了使用 ChatGPT逐步创建 一个简单的Java框架&#xff0c;包括构思、交流、深入优化、逐步完善和性能测试等步骤。 亲爱的Javaer们&#xff0c;在平时编码的过程中&#xff0c;你是否曾想过编写一个Java框架去为开发提效&#xff1f;但是要么编写框架时感觉无从下…

Tauri:相比Electron,还有很长路要走的。

一、Tauri是什么 Tauri是一个开源的框架&#xff0c;用于构建跨平台的桌面应用程序。它允许开发者使用Web技术&#xff08;如HTML、CSS和JavaScript&#xff09;来构建高性能的本地应用程序&#xff0c;同时提供了访问底层操作系统功能的能力。 Tauri的设计目标是提供一种简单…

web读取前端txt并解析

用途&#xff0c;解析csv、txt等作为前端变量&#xff0c;方便进行其他操作。 假设txt里为数组。 1.html内容 <div class"input-group mb-3"><!-- <span class"input-group-text">文件路径</span>--><input type&q…

CI/CD总结

bitbucket deployment: Bitbucket Cloud resources | Bitbucket Cloud | Atlassian Support Jenkins:

第97讲:MHA高可用集群模拟主库故障以及修复过程

文章目录 1.分析主库故障后哪一个从库会切换为主库2.模拟主库故障观察剩余从库的状态2.1.模拟主库故障2.3.当前主从架构 3.修复故障的主库3.1.修复主库3.2.当前主从架构3.3.恢复MHA 1.分析主库故障后哪一个从库会切换为主库 在模拟MHA高可用集群主库故障之前&#xff0c;我们先…

【JavaSE篇】——抽象类和接口

目录 &#x1f393;抽象类 &#x1f388;抽象类语法 &#x1f388;抽象类特性 &#x1f388;抽象类的作用 &#x1f393;接口 &#x1f388;语法规则 &#x1f388;接口特性 &#x1f388;接口使用(实现USB接口&#xff09; &#x1f388;实现多个接口 &#x1f388;…

力扣刷题之旅:进阶篇(一)

力扣&#xff08;LeetCode&#xff09;是一个在线编程平台&#xff0c;主要用于帮助程序员提升算法和数据结构方面的能力。以下是一些力扣上的入门题目&#xff0c;以及它们的解题代码。 --点击进入刷题地址 题目1&#xff1a;三数之和 题目描述&#xff1a; 给定一个包含n个…

代码随想录算法训练营第41天 | 343.整数拆分 + 96.不同的二叉搜索树

今日任务 343. 整数拆分 96.不同的二叉搜索树 343.整数拆分 - Medium 题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0…

springboot+vue实现excel导出

后端 导入pom依赖 <dependency>x<groupId>cn.afterturn</groupId><artifactId>easypoi-spring-boot-starter</artifactId><version>4.2.0</version> </dependency> Entity实体类 这里以User为例&#xff0c;可按照自己实际…

vulhub中AppWeb认证绕过漏洞(CVE-2018-8715)

AppWeb是Embedthis Software LLC公司负责开发维护的一个基于GPL开源协议的嵌入式Web Server。他使用C/C来编写&#xff0c;能够运行在几乎先进所有流行的操作系统上。当然他最主要的应用场景还是为嵌入式设备提供Web Application容器。 AppWeb可以进行认证配置&#xff0c;其认…