面试经典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(" ");
    }
}

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

相关推荐
与遨游于天地11 分钟前
NIO的三个组件解决三个问题
java·后端·nio
June`35 分钟前
全排列与子集算法精解
算法·leetcode·深度优先
czlczl2002092538 分钟前
Guava Cache 原理与实战
java·后端·spring
徐先生 @_@|||38 分钟前
Palantir Foundry 五层架构模型详解
开发语言·python·深度学习·算法·机器学习·架构
yangminlei39 分钟前
Spring 事务探秘:核心机制与应用场景解析
java·spring boot
夏鹏今天学习了吗2 小时前
【LeetCode热题100(78/100)】爬楼梯
算法·leetcode·职场和发展
记得开心一点嘛2 小时前
Redis封装类
java·redis
圣保罗的大教堂2 小时前
leetcode 712. 两个字符串的最小ASCII删除和 中等
leetcode
007php0072 小时前
mySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据
数据库·redis·git·mysql·面试·职场和发展·php