zoukankan      html  css  js  c++  java
  • leetcode — text-justification

    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    
    /**
     *
     * Source : https://oj.leetcode.com/problems/text-justification/
     *
     *
     * Given an array of words and a length L, format the text such that each line has
     * exactly L characters and is fully (left and right) justified.
     *
     *
     * You should pack your words in a greedy approach; that is, pack as many words as you can in each line.
     * Pad extra spaces ' ' when necessary so that each line has exactly L characters.
     *
     * Extra spaces between words should be distributed as evenly as possible.
     * If the number of spaces on a line do not divide evenly between words,
     * the empty slots on the left will be assigned more spaces than the slots on the right.
     *
     * For the last line of text, it should be left justified and no extra space is inserted between words.
     *
     * For example,
     * words: ["This", "is", "an", "example", "of", "text", "justification."]
     * L: 16.
     *
     * Return the formatted lines as:
     *
     * [
     *    "This    is    an",
     *    "example  of text",
     *    "justification.  "
     * ]
     *
     * Note: Each word is guaranteed not to exceed L in length.
     *
     *
     * Corner Cases:
     *
     * A line other than the last line might contain only one word. What should you do in this case?
     * In this case, that line should be left-justified.
     */
    public class TextJustification {
    
        /**
         * 格式化给定的单词串,每行长度固定
         *
         * @param words
         * @return
         */
        public String[] justify (String[] words, int length) {
            if (words.length < 1) {
                return words;
            }
            if (words.length == 1) {
                words[0] = words[0] + getSpace(length - words[0].length());
                return words;
            }
            int gap = 0;
            int lineLength = words[0].length();
            List<String> result = new ArrayList<String>();
            List<String> lineWords = new ArrayList<String>(){{add(words[0]);}};
            int index = 1;
            while (index < words.length) {
                int sum = gap + lineLength + words[index].length();
                if (sum >= length) {
                    result.add(buildLine(lineWords, gap, length - gap - lineLength));
                    gap = -1;
                    lineLength = 0;
                    lineWords.clear();
                }
                gap++;
                lineLength += words[index].length();
                lineWords.add(words[index]);
                index ++;
                // 最后一行
                if (index == words.length) {
                    result.add(buildLine(lineWords, gap, length - gap - lineLength));
                }
    
            }
            return result.toArray(new String[result.size()]);
        }
        private String buildLine (List<String> words, int gap, int remain) {
            if (words.size() == 1) {
                return words.get(0) + getSpace(remain);
            }
            StringBuilder result = new StringBuilder();
            for (int i = 0; i < words.size() - 1; i++) {
                int spaceLen = 1 + remain / gap;
                if (i < remain % gap) {
                    spaceLen ++;
                }
                result.append(words.get(i) + getSpace(spaceLen));
            }
            result.append(words.get(words.size()-1));
            return result.toString();
        }
    
        private String getSpace (int n) {
            String space = "";
            for (int i = 0; i < n; i++) {
                space += " ";
            }
            return space;
        }
    
    
        public static void main(String[] args) {
            TextJustification textJustification = new TextJustification();
            String[] words = new String[]{"This", "is", "an", "example", "of", "text", "justification."};
            System.out.println(Arrays.toString(textJustification.justify(words, 16)));
        }
    
    }
    
  • 相关阅读:
    Error_OAF_the descriptive flexfield with application name payables and name is not frozen
    Error_OAF_Flex VO() of flex bean (ExpenseDescFlexs) is null (异常)
    AME_Oracle自带AME审批链详解AME Standard Handler(概念)
    PS_Form个性化复杂需求新增Menu并调用Request(案例)
    PS_Form个性化选择Block自动查询和查询条件排序实现(案例)
    Error_Unix Shell_syntax error near unexpected token `fi'
    PLSQL_性能优化效能跟踪工具DBMS_PROFILER分析(案例)
    Workflow_工作流的基本元素(概念)
    Form_如何通过标准功能查找数据源(概念)
    Report_SRW工具的基本用法(概念)
  • 原文地址:https://www.cnblogs.com/sunshine-2015/p/7684946.html
Copyright © 2011-2022 走看看