重新格式化字符串
难度:
标签:
题目描述
代码结果
运行时间: 28 ms, 内存: 16.8 MB
/*
* 思路:
* 1. 使用Stream将字符串中的字母和数字分别分离出来。
* 2. 如果字母和数字的数量差超过1,返回空字符串。
* 3. 将字母和数字交替合并到新的字符串中。
*/
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class ReformatStringStream {
public String reformat(String s) {
List<Character> letters = s.chars()
.mapToObj(c -> (char) c)
.filter(Character::isLetter)
.collect(Collectors.toList());
List<Character> digits = s.chars()
.mapToObj(c -> (char) c)
.filter(Character::isDigit)
.collect(Collectors.toList());
if (Math.abs(letters.size() - digits.size()) > 1) {
return "";
}
StringBuilder result = new StringBuilder();
boolean letterFirst = letters.size() >= digits.size();
while (!letters.isEmpty() || !digits.isEmpty()) {
if (letterFirst && !letters.isEmpty()) {
result.append(letters.remove(0));
} else if (!letterFirst && !digits.isEmpty()) {
result.append(digits.remove(0));
}
letterFirst = !letterFirst;
}
return result.toString();
}
}
解释
方法:
题目要求将字符串重新格式化,使得任意两个相邻字符的类型都不同(字母和数字交替出现)。首先检查字符串是否只含有一种字符(全部是字母或者全部是数字),如果是,则直接返回空字符串。接着,遍历字符串,将数字和字母分别存储到两个列表中。如果两个列表的长度差大于1,也返回空字符串,因为无法按要求格式化。最后,根据两个列表的长度关系,交替从两个列表中取出元素拼接到结果字符串中,确保较长的列表元素先取。如果有剩余的元素(只会剩下一个),则追加到结果字符串的末尾。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
为什么在只有字母或只有数字的情况下,直接返回空字符串?是否有其他可能的输出格式?
▷🦆
算法中为何选择先检查字母和数字的数量差异大于1就返回空字符串,这里的逻辑依据是什么?
▷🦆
当字母和数字数量相等时,是否有特定的顺序要求来开始拼接字符串,例如先字母还是先数字?
▷🦆
算法中提到如果列表中还有剩余的字母或数字会追加到结果字符串的末尾,这种情况是如何保证仍然满足任意两个相邻字符类型不同的要求?
▷