面试经典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)

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(" ");
    }
}

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

相关推荐

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

    2024-05-03 14:04:12       31 阅读
  2. 面试经典---68.文本左右对齐

    2024-05-03 14:04:12       56 阅读
  3. 面试经典 150

    2024-05-03 14:04:12       26 阅读
  4. 【LeetCode面试经典150】101. 对称二叉树

    2024-05-03 14:04:12       36 阅读
  5. 面试经典150(96-100)

    2024-05-03 14:04:12       63 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-03 14:04:12       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-03 14:04:12       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-03 14:04:12       87 阅读
  4. Python语言-面向对象

    2024-05-03 14:04:12       96 阅读

热门阅读

  1. php 追加 内容

    2024-05-03 14:04:12       28 阅读
  2. PostgreSQL自带的工具介绍

    2024-05-03 14:04:12       30 阅读
  3. 单例模式的几种实现方式

    2024-05-03 14:04:12       36 阅读
  4. RSA实现中弱密钥漏洞分析

    2024-05-03 14:04:12       34 阅读
  5. Django响应‘表单请求’过程

    2024-05-03 14:04:12       29 阅读
  6. Django运行不提示网址问题

    2024-05-03 14:04:12       35 阅读
  7. 02 C

    2024-05-03 14:04:12       26 阅读