我正在尝试在Dart/Flutter中建立一个简单的算法来检查一个给定的字符串,如果它有两个连续的字母,它就会删除其中的一个。
输入:你好,福尔,契诺,脚部输出: helo,for,del,fot
这就是我到目前为止所做的:
dropDoubleLetters(String str) {
List<String> strArray = new List();
strArray = str.split('');
String finalizedStr = "";
for (var counter = 0; counter >= strArray.length; counter++) {
finalizedStr += strArray[counter];
if (strArray[counter] == strArray[counter + 1]) {
strArray.removeAt(counter + 1);
finalizedStr += strArray[counter];
}
}
print('word is :' + finalizedStr);
}问题是该方法的输出始终为null,它总是以这种格式返回:
颤振:单词是:
如何解决这个算法,我在这里做错了什么??
发布于 2020-07-31 14:17:45
首先,counter >= strArray.length是错误的,因为指数在范围内(0,strArray.length - 1).接下来,finalizedStr变量是无用的,因为您正在修改原始的strArray。因此,strArray本身就是答案。
dropDoubleLetters(String str) {
List<String> strArray = new List();
strArray = str.split('');
for (var counter = 0; counter < strArray.length - 1; counter++) {
if (strArray[counter] == strArray[counter + 1]) {
strArray.removeAt(counter + 1);
}
}
print('word is :' + strArray.join(''));
}另一种方法是用前一个字符检查每个字符:
dropDoubleLetters(String str) {
List<String> strArray = new List();
strArray = str.split('');
String finalizedStr = strArray[0];
for (var counter = 1; counter < strArray.length; counter++) {
if (strArray[counter] != strArray[counter - 1]) {
finalizedStr += strArray[counter];
}
}
print('word is :' + finalizedStr);
}注意:在第一种方法中,每个字符都与下一个one(strArray[counter + 1]),进行比较,因此计数器最多应该是strArray.length - 2__。
发布于 2020-07-31 14:29:15
我知道没人要这个,所以别把答案记下来。但是,如果有人认为“这可以通过使用正则表达式来解决”,那么下面就是这个想法的答案:
void main() {
final wordList = ['hello', 'foor', 'deed', 'foot'];
print(wordList.map(dropDoubleLettersRegExp).toList()); // [helo, for, ded, fot]
}
String dropDoubleLettersRegExp(String str) =>
str.replaceAllMapped(RegExp(r'(\w)\1+'), (match) => match.group(1));发布于 2020-07-31 14:14:34
您正在对>= strArray.length进行迭代,从0开始,这意味着您的循环最终将执行strArraystrArray.length,这将引发一个异常,因为您要脱离绑定,请记住,您的最后一个元素是at (strArray.length-1 ),尝试在">“中更改">=”,您应该会没事。
https://stackoverflow.com/questions/63193385
复制相似问题