侧边栏壁纸
博主头像
GabrielxD

列車は必ず次の駅へ。では舞台は?私たちは?

  • 累计撰写 675 篇文章
  • 累计创建 128 个标签
  • 累计收到 26 条评论

目 录CONTENT

文章目录

【字符串, 模拟】重新排列单词间的空格

GabrielxD
2022-09-07 / 0 评论 / 0 点赞 / 310 阅读 / 846 字
温馨提示:
本文最后更新于 2022-09-07,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

题目

1592. 重新排列单词间的空格


给你一个字符串 text ,该字符串由若干被空格包围的单词组成。每个单词由一个或者多个小写英文字母组成,并且两个单词之间至少存在一个空格。题目测试用例保证 text 至少包含一个单词

请你重新排列空格,使每对相邻单词之间的空格数目都 相等 ,并尽可能 最大化 该数目。如果不能重新平均分配所有空格,请 将多余的空格放置在字符串末尾 ,这也意味着返回的字符串应当与原 text 字符串的长度相等。

返回 重新排列空格后的字符串

示例 1:

输入:text = "  this   is  a sentence "
输出:"this   is   a   sentence"
解释:总共有 9 个空格和 4 个单词。可以将 9 个空格平均分配到相邻单词之间,相邻单词间空格数为:9 / (4-1) = 3 个。

示例 2:

输入:text = " practice   makes   perfect"
输出:"practice   makes   perfect "
解释:总共有 7 个空格和 3 个单词。7 / (3-1) = 3 个空格加上 1 个多余的空格。多余的空格需要放在字符串的末尾。

示例 3:

输入:text = "hello   world"
输出:"hello   world"

示例 4:

输入:text = "  walks  udp package   into  bar a"
输出:"walks  udp  package  into  bar  a "

示例 5:

输入:text = "a"
输出:"a"

提示:

  • 1 <= text.length <= 100
  • text 由小写英文字母和 ' ' 组成
  • text 中至少包含一个单词

解题

方法一:模拟

思路

根据题意模拟。

具体思路:先把字符串按照任意多空格分割(words),并统计出字符串中的空格数量(spaceCnt),每个单词间应该间隔的空格数量就是:spaceCnt / (words.size()-1),最后多余的空格数量是:spaceCnt % (words.size()-1),新起一个字符串构建符合要求的字符串即可。

注意:字符串中只有一个单词的时候需要特判,否则分母会是 0 引发异常。

代码

class Solution {
public:
    string reorderSpaces(string text) {
        vector<string> words;
        int n = text.length();
        int space_cnt = 0;
        for (int i = 0; i < n;) {
            if (text[i] == ' ') {
                ++space_cnt;
                ++i;
            } else {
                int j = i + 1;
                while (j < n && text[j] != ' ') ++j;
                words.push_back(text.substr(i, j - i));
                i = j;
            }
        }
        int word_cnt = words.size();
        if (word_cnt == 1) return words[0] + string(space_cnt, ' ');
        text.clear();
        int avg = space_cnt / (word_cnt - 1);
        string spaces(avg, ' ');
        for (int i = 0; i < word_cnt; ++i) {
            text += words[i];
            if (i != word_cnt - 1) text += spaces;
            else {
                for (int j = space_cnt % (word_cnt - 1); j > 0; --j) text += " ";
            }
        }
        return text;
    }
};
class Solution {
    public String reorderSpaces(String text) {
        String[] words = text.split("\\s+");
        int spaceCnt = 0, wordCnt = words.length;
        for (char ch : text.toCharArray()) {
            if (ch == ' ') ++spaceCnt;
        }
        int start = 0;
        if (text.charAt(0) == ' ') {
            --wordCnt;
            ++start;
        }
        if (spaceCnt == 0) return text;
        if (wordCnt == 1) {
            StringBuilder ans = new StringBuilder(words[start]);
            for (int i = 0; i < spaceCnt; ++i) ans.append(" ");
            return ans.toString();
        }
        int avg = spaceCnt / (wordCnt - 1);
        StringBuilder spaces = new StringBuilder();
        for (int i = 0; i < avg; ++i) spaces.append(" ");
        StringBuilder ans = new StringBuilder();
        for (; start < words.length; ++start) {
            ans.append(words[start]);
            if (start != words.length - 1) ans.append(spaces);
            else {
                for (int i = spaceCnt % (wordCnt - 1); i > 0; --i) ans.append(" ");
            }
        }
        return ans.toString();
    }
}
0

评论区