面试经典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.hqwc.cn/news/450889.html

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

相关文章

深入理解Linux内核之IO多路复用上

目录 Linux代码结构看网络通信 Linux下的IO复用编程 文件描述符FD select poll epoll select、poll、epoll的比较 1、支持一个进程所能打开的最大连接数 2、FD剧增后带来的IO效率问题 3、消息传递方式 总结 Linux代码结构看网络通信 Linux内核的源码包含的东西很多&…

NAS系统折腾记 – Emby搭建家庭多媒体服务器

Emby简介 Emby是一款优秀的媒体服务器软件&#xff0c;致力于为用户提供丰富的多媒体体验。通过Emby&#xff0c;您可以方便地在家庭内的各种设备上观看您喜爱的电影、电视剧和其他视频内容。而且&#xff0c;Emby还具备强大的媒体管理功能&#xff0c;让您的影视资源井然有序…

小米平板6获取root权限教程

1. 绑定账号 1> 打开"设置-我的设备-全部参数-连续点击MIUI版本按钮"&#xff0c;直到提示已打开开发者模式( p s : 这里需要重点关注红框平板型号和 M I U I 版本&#xff0c;例如我这里平板型号是 X i a o m i P a d 6 &#xff0c; M I U I 版本是 14.0.10 &am…

C/C++ 回调函数 callback 异步编程

一、C语言的回调函数 1.小试牛刀 #include <iostream> using namespace std; #include <memory> #include <stdlib.h>int add(int a, int b) {return a b; }void test01() {// 函数指针可以指向任何类型的函数&#xff0c;只要函数的参数列表和返回值类型…

政安晨:示例演绎Python的列表

列表和你可以用它们做的事&#xff1a;包括索引、切片和对象变动 (变异-Mutation) 。 列表 在Python中&#xff0c;列表表示有序的值序列。以下是如何创建列表的示例&#xff1a; primes [2, 3, 5, 7] 我们可以将其他类型的元素放在列表中&#xff1a; planets [Mercury…

股票交易

这里尝试利用单调队列优化&#xff0c;这里不好直接用单调队列的原因是因为(以买为例)\(-ap[i]*k_1\)不是只与下标有关的 所以解决方案一&#xff1a;我们将下标变成一个整体&#xff0c;再把后面的代价换掉然后将与下标无关的直接提出去 解决方案二&#xff1a;利用“蚯蚓”那…

深入了解 Ansible:全面掌握自动化 IT 环境的利器

本文以详尽的篇幅介绍了 Ansible 的方方面面&#xff0c;旨在帮助读者从入门到精通。无论您是初学者还是有一定经验的 Ansible 用户&#xff0c;都可以在本文中找到对应的内容&#xff0c;加深对 Ansible 的理解和应用。愿本文能成为您在 Ansible 自动化旅程中的良师益友&#…

自学网安-IIS服务器

部署环境&#xff1a;win2003 配置环境&#xff1a;winxp ip&#xff1a;10.1.1.2 win2003 ip&#xff1a;10.1.1.1 开始安装 双击“应用程序服务器” 双击“Internet 信息服务&#xff08;IIS&#xff09;” 勾选万维网服务&#xff0c;确定然后下一步 查看端口号;netstat …

Fink CDC数据同步(三)Flink集成Hive

1 目的 持久化元数据 Flink利用Hive的MetaStore作为持久化的Catalog&#xff0c;我们可通过HiveCatalog将不同会话中的 Flink元数据存储到Hive Metastore 中。 利用 Flink 来读写 Hive 的表 Flink打通了与Hive的集成&#xff0c;如同使用SparkSQL或者Impala操作Hive中的数据…

阻塞队列(超详细易懂)

目录 一、阻塞队列 1.阻塞队列概述 2.生产者消费者模型 3.阻塞队列的作用 4.标准库中的阻塞队列类 5.例子&#xff1a;简单生产者消费者模型 二、阻塞队列模拟实现 1.实现循环队列&#xff08;可跳过&#xff09; 1.1简述环形队列 1.2代码实现 2.实现阻塞队列 2.1实…

[基础IO]文件描述符{重定向/perror/磁盘结构/inode/软硬链接}

文章目录 1. 再识重定向2.浅谈perror()3.初始文件系统4.软硬链接 1. 再识重定向 图解./sf > file.txt 2>&1 1中内容拷贝给2 使得2指向file 再学一个 把file的内容传给cat cat拿到后再给file2 2.浅谈perror() open()接口调用失败返回-1,并且错误码errno被适当的设置,…

回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测(SE注意力机制)

回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现CPO-CNN-LSTM-Attention冠豪猪优化卷积长短期记忆神经网络注意力机制多变量回归预测&#xff08;SE注…