题目
我的题解
方法一
根据空格的位置来推断单词数目,计算平均值和余数。重新读取原字符串,每读完一个单词放一组空格,读完即止。
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()
方法可以去除头尾空格