【发布时间】:2022-01-14 15:08:31
【问题描述】:
【问题讨论】:
-
邮政编码,不是代码截图。
【问题讨论】:
您可以将已打印的列表存储在变量List<List<int>> alreadySeen 中,并在打印前检查该变量是否包含要打印的列表。
void main() {
List<List<int>> intArr = [
[0, 0],
[1, 1],
[1, 1],
[1, 2],
[1, 3],
[1, 2],
];
List<List<int>> alreadySeen = [];
for (int i = 0; i < intArr.length; i++) {
if(!contains(alreadySeen, intArr[i])) {
print(intArr[i]);
alreadySeen.add(intArr[i]);
}
}
}
函数contains 将有2 个嵌套for 循环,一个循环遍历主列表,另一个循环遍历我们正在搜索的列表。
如果needle 值与主列表中的列表匹配,则变量found 保持true 并且函数返回true
bool contains(List<List<int>> list, List<int> needle) {
if (list.length == 0 || needle.length == 0) return false;
for (int i = 0; i < list.length; i++) {
if (list[i].length != needle.length) continue;
bool found = true;
for(int j = 0; j < list[i].length; j++) {
if (list[i][j] != needle[j]) found = false;
}
if (found) return true;
}
return false;
}
请注意,如果您使用颤振,则有一个名为 listEquals 的函数可以使函数 contains 更容易看到 this 但是您不能使用基本函数 intArr.contains 因为它会比较 reference 的数组而不是它们的values
工作Jdoodle。
正如@jamesdlin 指出的那样,如果性能对您很重要,您可以使用 LinkedHashSet 而不是 List for
alreadySeen 来使 contains 函数 O(1) 而不是 O(n)。
【讨论】:
alreadySeen 改为LinkedHashSet,则它可以变成O(n)。