任务是在List中存储连续字符。Main with Input/Output如下所示:
public static void main(String[] args) {
List<String> blocks = blocks("Hello faaantastic world");
System.out.println(blocks); // => ["ll", "aaa"]
System.out.println(blocks("aaabccdeeeefaaa")); // => ["aaa", "cc", "eeee", "aaa"]
System.out.println(blocks("This is an example")); // => []
System.out.println(blocks("Another example ...")); // => [" ", "..."]
System.out.println(blocks("")); // => []
我的方法是这样的:
public static LinkedList<String> blocks(String s) {
LinkedList<String> list = new LinkedList<>();
String word = "";
for(char c : s.toCharArray()) {
if (c == ??) {
}
}
return list;
String字用于存储连续的字母。我找到了toCharArray来拆分字符串的每个字符。但我有一个问题,如果block。如果我用c == c+1来检查I和I的下一个字符,它不起作用…我不知道如何解决这个问题。有人能帮帮我吗?为了解决这个问题,我花了2天时间……
还有其他方法可以编写这段代码,但是要充分利用您所做的,只需缓存prevChar,以便您可以将c与它进行比较。如何初始化prevChar是棘手的,要么选择文本中不可能的东西,要么添加另一个bool变量来指示你正在处理第一个字符,或者窥视数组以确保prevChar与第一个字符不同。
在这种情况下,最好使用String::charAt
方法来检索输入字符串中的字符以及它们与前一个字符的比较。
public static LinkedList<String> blocks(String s) {
LinkedList<String> list = new LinkedList<>();
String word = "" + s.charAt(0);
for(int i = 1, n = s.length(); i < n; i++) {
if (s.charAt(i) == s.charAt(i - 1)) {
word += s.charAt(i);
} else {
if (word.length() > 1) {
list.add(word);
}
word = "" + s.charAt(i);
}
}
if (word.length() > 1) {
list.add(word);
}
return list;
}
测试System.out.println(blocks("Hello faaantastic worlddd"));
输出[ll, aaa, ddd]
可以使用正则表达式查找重复字符(.)1+
:
public static List<String> findConsecutive(String s) {
return Pattern.compile("(.)\1+").matcher(s).results() // Stream<MatchResult>
.map(mr -> mr.group(0)) // 0 group contains repeated characters
.collect(Collectors.toList());
}
测试System.out.println(findConsecutive("Hello faaantastic worlddd"));
输出[ll, , aaa, ddd]