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

题目

题目及示例

我的题解

方法一

根据空格的位置来推断单词数目,计算平均值和余数。重新读取原字符串,每读完一个单词放一组空格,读完即止。

class Solution {
    public String reorderSpaces(String text) {
        StringBuilder newStr = new StringBuilder();
        int count = 0;
        int wordNum = 0;
        for (int i = 0; i < text.length(); i++) {
            if (text.charAt(i) == ' ') {
                count++;
            } else {
                if (i == 0) {
                    wordNum = 1;
                } else if (text.charAt(i - 1) == ' ') {
                    wordNum++;
                }
            }
        }
        if (wordNum == 1) {
            for (int i = 0; i < text.length(); i++) {
                if (text.charAt(i) != ' ') {
                    newStr.append(text.charAt(i));
                }
            }
            for (int i = 0; i < count; i++) {
                newStr.append(' ');
            }
            return newStr.toString();
        }
        // 计算平均空格数及余数
        int spaceNum = count / (wordNum - 1);
        int remainder = count % (wordNum - 1);
        StringBuilder space = new StringBuilder(spaceNum);
        // 把平均的空格合并
        for (int i = 0; i < spaceNum; i++) {
            space.append(' ');
        }
        StringBuilder remainSpace = new StringBuilder(remainder);
        // 把余数合并
        for (int i = 0; i < remainder; i++) {
            remainSpace.append(' ');
        }
        boolean wasSpace = false; // 上一个值是否为空格
        for (int i = 0; i < text.length(); i++) {
            if (text.charAt(i) != ' ') {
                newStr.append(text.charAt(i));
                wasSpace = false;
            } else {
                if (!wasSpace && newStr.length() != 0 && i != text.length() - 1) {
                    newStr.append(space);
                    wasSpace = true;
                }
            }
        }
        // 去除最后多余的空格
        if (newStr.lastIndexOf(" ") == newStr.length() - 1) {
            newStr.delete(newStr.length() - spaceNum, newStr.length());
        }
        newStr.append(remainSpace);
        return newStr.toString();
    }
}

方法二

平均值和余数算法与方法一相同,将读取到的单词存入数组中,最后能更好地拼接成结果,但是内存消耗比一大。
优化了方法一中的一些代码。

class Solution {
    public String reorderSpaces(String text) {
        StringBuilder newStr = new StringBuilder();
        StringBuilder tempWord = new StringBuilder();
        String[] wordList = new String[text.length()+1];
        int count = 0;
        int wordNum = 0;
        for (int i = 0; i < text.length(); i++) {
            if (text.charAt(i) == ' ') {
                count++;
                if (tempWord.length() != 0) {
                    wordList[wordNum] = tempWord.toString();
                }
                tempWord.delete(0, tempWord.length());
            } else {
                if (i == 0 || text.charAt(i - 1) == ' ') {
                    wordNum++;
                }
                tempWord.append(text.charAt(i));
            }
        }
        if (text.lastIndexOf(' ') != text.length() - 1) {
            wordList[wordNum] = tempWord.toString();
        }
        // 如果只有一个单词则直接输出
        if (wordNum == 1) {
            for (int i = 0; i < text.length(); i++) {
                if (text.charAt(i) != ' ') {
                    newStr.append(text.charAt(i));
                }
            }
            for (int i = 0; i < count; i++) {
                newStr.append(' ');
            }
            return newStr.toString();
        }
        // 计算平均空格数及余数
        int spaceNum = count / (wordNum - 1);
        int remainder = count % (wordNum - 1);
        StringBuilder space = new StringBuilder();
        StringBuilder remainSpace = new StringBuilder();

        // 把空格合并
        for (int i = 0; i < Math.max(spaceNum, remainder); i++) {
            if (i < spaceNum) {
                space.append(' ');
            }
            if (i < remainder) {
                remainSpace.append(' ');
            }
        }
        for (int i = 1; i <= wordNum; i++) {
            newStr.append(wordList[i]);
            if (i == wordNum) {
                newStr.append(remainSpace);
            } else {
                newStr.append(space);
            }
        }
        return newStr.toString();
    }
}

其他题解

解法链接想法跟我一样,使用了split(), trim()等函数使代码更简单。

总结

  • split()可以简单地将字符串中的所有单词提取出来成为一个数组,很省时间
  • trim()方法可以去除头尾空格
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值