我使用HashMap来存储每个元素的出现,然后遍历哈希图以获取重复的元素,但这个解决方案感觉不太对劲。
Firecode.io中的问题陈述:
编写一个方法duplicate来查找数组中重复的元素。该方法应该返回一个字符串中重复整数的列表,其中的元素按升序排序(如下所示)。
重复({1,3,4,2,1})
--
重复({1,3,4,2,1,2,4})
--
注意:您可以使用 toString() 方法返回大多数数据结构的标准字符串表示形式,并使用 Arrays.sort() 对结果进行排序。
这是我的代码:
public String duplicate(int[] numbers) {
HashMap < Integer, Integer > hs = new HashMap < Integer, Integer > ();
for (int i = 0; i < numbers.length; i++) {
if (hs.get(numbers[i]) == null) {
hs.put(numbers[i], 1);
} else hs.put(numbers[i], (Integer) hs.get(numbers[i]) + 1);
}
int size = 0;
for (int i: hs.keySet()) {
if (hs.get(i) > 1) {
size++;
}
}
int j = 0;
int[] a = new int[size];
for (int i: hs.keySet()) {
if (hs.get(i) > 1) {
a[j++] = i;
}
}
Arrays.sort(a);
return Arrays.toString(a);
}
如果您使用的是Java 8或更高版本,您可以尝试:
public String duplicate(int[] numbers) {
Map<Integer, Integer> hs = new HashMap<>();
for ( int i : numbers ) {
hs.merge( i, 1, Integer::sum);
}
return '[' +
hs.entrySet()
.stream()
.filter( e -> e.getValue() > 1 )
.map(Entry::getKey)
.sorted()
.map(i -> i.toString())
.collect(Collectors.joining(", ")) +
']';
}
由于您不必知道元素重复的次数,因此只需要一个 Set
来记住哪些元素是唯一的,哪些不是。如果您知道元素值(例如,介于 1 和 10 之间的数字),则可以进一步简化 Set
to boolean[]
或位向量:
int[] numbers = {1, 3, 4, 2, 2, 1, 2, 4, 4};
Set<Integer> unique = new HashSet<>();
Set<Integer> duplicates = new HashSet<>();
for (int n : numbers) {
if (!unique.add(n)) {
duplicates.add(n);
}
}
List<Integer> result = new ArrayList<>(duplicates);
result.sort(Integer::compareTo);
System.out.println(result); // [1, 2, 4]
以下是我的做法:(出于教育目的的注释,可能不会在生产代码中包含它们。
public String duplicate(int[] numbers) {
// holds the items we've encountered more than once.
// TreeSet<> keeps things in sorted order for us.
final SortedSet<Integer> duplicates = new TreeSet<>();
// keeps track of items we've encountered.
final Set<Integer> encountered = new HashSet<>();
// iterate over every number
for (final int number : numbers) {
// Add the item to encountered. Set.add() will return true if
// the element is new to the set.
if (!encountered.add(number)) {
// Since the element wasn't new, ensure this item exists in the duplicates collection.
duplicates.add(number);
}
}
return duplicates.toString();
}
我有一个包含HTML元素的数组(我用)填充了它,我试图在该数组中查找元素的索引,但控制台给出了错误: 未捕获的TypeError:rows.indexOf不是函数 我用它来填充数组所需的HTML元素: 值得注意的是,这些元素是用javascript生成的,然后使用放入数组中。如果要检查整个过程,这里有一个jsfiddle
题目链接 牛客网 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 // html Input: {2, 3, 1, 0, 2, 5} Output: 2 解题思路 要求时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标
问题内容: 这个问题已经在这里有了答案 : 7年前关闭。 可能重复: 错误:找不到vcvarsall.bat 我正在尝试为python安装MySql接口,但出现错误(如下所述)。我知道解决方案:安装Microsoft Visual C 。除了安装Microsoft Visual C ,还有其他解决方案吗?我的意思是这真的伤害了我。我为什么要安装Microsoft Visual C ++仅仅是因为构
一、题目 在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 举例说明 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。 二、解题思路 解决这个问题的一个简单的方法是先把输入的数组排序。从排序的数组中找出重复的数字时间很容易的事情,只需
好的,所以我查询DB并从IP地址列表生成一个数组: 返回的数组看起来像这样: 但是如果我想找到上面列表中的第一个或任何IP,出于某种原因,它什么也找不到: 我到底做错了什么?
我在一个名为course的模式中有一个名为students的数我创建了一个路由,允许我使用学生的将学生添加到这个数组中,如下所示: 当我尝试用以下JSON体向我的endpoint发出PUT请求时: 谢谢!