面试经典150题——文本左右对齐

面试经典150题 day24

题目来源

力扣每日一题;题序:68

我的题解

方法一 模拟

分情况讨论

  1. 是最后一行 ------------将所有字符串先组合在一起,然后在末尾加空格
  2. 是单个单词一行 ------------ 将单个字符串先组合在一起,然后在末尾加空格
  3. 其他情况 -------------求均分的空格数avg和均分后还剩余的空格数ex,[left,left+ex+1)之间插入的空格数为 avg+1,[left+ex+1,right)之间插入空格数为 avg,注意:在两个范围之间还需要插入一个 avg的空格数
    时间复杂度 :O(m)。其中 m 是数组 words 中所有字符串的长度之和
    空间复杂度:O(m)
java 复制代码
public List<String> fullJustify(String[] words, int maxWidth) {
    List<String> res=new ArrayList<>();
    int n=words.length;
    for(int i=0;i<n;){
        int start=i;
        int end=start+1;
        //len记录当前行的使用字符串构成的新字符串的长度(现贪心,单词间只加一个空格)
        int len=words[start].length();
        while(end<n&&len+words[end].length()+1<=maxWidth){
            len+=words[end].length()+1;
            end++;
        }
        StringBuilder sb=new StringBuilder();
        //最后一行
        if(end==n){
            for(int j=start;j<end;j++){
                sb.append(words[j]);
                if(j!=end-1)
                    sb.append(' ');
            }
            insertSpace(sb,maxWidth-sb.length());
        //一行只有一个字符串
        }else if(start+1==end){
            sb.append(words[start]);
            insertSpace(sb,maxWidth-sb.length());
        }else{
            //在每两个字符之间加入1个空格后,还需要添加空格的数量
            int sub=maxWidth-len;
            //有多少个可以插入空格的位置
            int num=end-start-1;
            // 单词间实际需要插入的空格数(注意:这里是指右侧需要插入的空格数,左侧需要比右侧多1)
            int need=sub/num+1;
            //左侧应该有几个插入空格的地方
            int mod=sub%num;
            sb.append(words[start]);
            //先模拟左侧单词的加入
            for(int j=0;j<mod;j++){
                insertSpace(sb,need+1);
                sb.append(words[start+j+1]);
            }
            //再模拟右侧单词的加入
            for(int j=mod;j<num;j++){
                insertSpace(sb,need);
                sb.append(words[start+j+1]);
            }
        }
        res.add(sb.toString());
        i=end;
    }
    return res;
}

public void insertSpace(StringBuilder sb,int count){
    for(int i=0;i<count;i++){
        sb.append(" ");
    }
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

相关推荐
想做小南娘,发现自己是女生喵33 分钟前
第 2 章 顺序表和 vector
java·数据结构·算法
艾醒1 小时前
2026年第29周(7.13-7.19)AI全复盘:技术突破、行业趣闻翻车、算力服务器商业动态
人工智能·算法
CHANG_THE_WORLD1 小时前
6.多线程的TCP通信
java·网络·tcp/ip
雪碧聊技术2 小时前
动态规划算法—01背包问题
算法·动态规划
bu_shuo2 小时前
c与cpp中的argc和argv
c语言·c++·算法
普贤莲花2 小时前
【2026年第29周---写于20260718】---整理,断舍离
程序人生·算法·生活
Reart2 小时前
Leetcode 674.最长连续递增序列 (719)
后端·算法
sun03222 小时前
【笔记】Spring MVC 相关介绍
java·spring·mvc
Reart2 小时前
Leetcode 300.最长递增子序列(719)
算法
可编程芯片开发2 小时前
VSG虚拟同步发电机simulink建模与仿真
算法