题解 | #将单词均匀排列#

将单词均匀排列

https://www.nowcoder.com/practice/47cb397f179a46e1ac0f2e388e1f844a

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param words string字符串一维数组
     * @param maxWidth int整型
     * @return string字符串一维数组
     */
    public String[] arrangeWords (String[] words, int maxWidth) {
        // write code here
        List<String> result = new ArrayList<>();
        int i = 0;

        while (i < words.length) {
            int j = i;
            int curWidth = words[j].length();
            j++;

            while (j < words.length && curWidth + words[j].length() + (j - i) <= maxWidth) {
                curWidth += words[j].length();
                j++;
            }

            int totalSpaces = maxWidth - curWidth;
            int numWords = j - i - 1;

            StringBuilder line = new StringBuilder(words[i]);

            if (j < words.length) {
                for (int k = i + 1; k < j; k++) {
                    int numSpaces = (j - k == 1 ||
                                     j == words.length) ? 1 : (totalSpaces + j - k - 2) / (j - k - 1);
                    line.append(repeatChar(' ', numSpaces));
                    totalSpaces -= (numSpaces - 1);
                    line.append(words[k]);
                }
 
                if (line.length() < maxWidth) {
                    line.append(repeatChar(' ', maxWidth - line.length()));
                }
            } else {
                for (int k = i + 1; k < j; k++) {
                    line.append(" ");
                    line.append(words[k]);
                }
                line.append(repeatChar(' ', totalSpaces));
            }

            result.add(line.toString());
            i = j;
        }

        return result.toArray(new String[0]);
    }

    private String repeatChar(char c, int count) {
        StringBuilder result = new StringBuilder();
        for (int i = 0; i < count; i++) {
            result.append(c);
        }
        return result.toString();
    }
}

Java

这道题目考察了贪心算法和字符串处理的能力,

主要是将给定的单词列表按照规定的最大行宽进行排列,并保持每行的单词之间间隔尽可能均匀。

代码的文字解释如下:

  1. 创建一个空的字符串列表 result 以保存最终的排列结果。定义一个整数变量 i 并初始化为 0,用于追踪当前处理的单词索引。
  2. 进入主循环,用于遍历单词列表。在循环内部,定义整数变量 j 和 curWidth,其中 j 表示当前行的单词结束索引,curWidth 表示当前行中所有单词的总宽度。
  3. 在内层循环中,通过计算当前行的宽度,判断是否还能容纳更多的单词。如果可以,将 curWidth 增加下一个单词的长度,并将 j 增加 1。
  4. 计算当前行剩余的空格数,即 maxWidth 减去 curWidth。计算还未放置的单词数量,即 numWords。
  5. 创建一个 StringBuilder 对象 line,将当前行的第一个单词添加进去。
  6. 根据情况,分两种情况处理:a. 如果当前行不是最后一行,即 j < words.length:在一个循环中,从当前行的下一个单词开始遍历到最后一个单词。计算单词之间的平均空格数 avgSpaces,以及额外的空格数 extraSpaces。根据平均空格数和额外空格数,计算每个单词之间的实际空格数,并将其添加到 line 中。如果 line 的长度仍然小于 maxWidth,在行末补充额外的空格。b. 如果当前行是最后一行,即 j == words.length:在一个循环中,将当前行的下一个单词逐个添加到 line 中,每个单词之间用一个空格分隔。在行末补充剩余的空格,使得 line 的长度达到 maxWidth。
  7. 将当前行的内容 line 添加到结果列表 result 中。
  8. 将索引 i 更新为 j,以便继续处理下一行。
  9. 在主循环结束后,将 result 转换为字符串数组并返回。
  10. 实现了一个辅助方法 repeatChar,用于重复生成一个指定字符多次。
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-10 13:54
点赞 评论 收藏
分享
鬼迹人途:你去投一投尚游游戏,服务器一面,第一个图算法,做完了给你一个策略题,你给出方案他就提出低概率问题,答不上当场给你挂
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
今天 14:00
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务