我将如何检查列和行的副本并返回true或false,具体取决于是否存在重复项。例如
1 2 3
3 1 2
2 3 1
将返回true,因为没有重复项,但是..
1 2 2
3 2 3
2 1 1
将返回false,因为第2列{2,2,1}中存在重复。
我如何检查行中是否有重复项,然后检查列中是否有重复项?
到目前为止,我只有以下内容:
public static boolean hasDuplicates(int [][] inArray)
{
for (int row = 0; row < inArray.length; row++)
{
int rowCheck = inArray[row][inArray.length];
for (int col = 0; col < inArray[row].length; col++)
{
}
}
return false;
}
所以我需要接受一个数组并检查列或行之间是否有任何重复。有什么指针吗?谢谢!
注意:使用外部方法无法做到这一点
答案 0 :(得分:1)
对于行,请尝试遵循以下过程:
boolean dup = false;
for (int k = 0; k < inArray[0].length){ //loop through columns
for (i = 0; i < inArray.length-1; i++) {
for (int j = i; j < inArray.length; j++){
if (inArray[k][i] == inArray[k][j]){
dup = true;
break;
}
}
}
}
所以,你从第一个元素开始,然后从元素2扫描到n(即列数)。如果找到匹配项,那么您将布尔值设置为true。如果不匹配,则i递增,内部for循环从元素3扫描到n。
对列进行类似的操作,您就完成了!
答案 1 :(得分:1)
浏览行中的每个值。对于每个值,请检查并查看该值之后的任何值是否相同。如果值相同,则返回true(您发现重复)。如果这些值都不相同,请递增索引并对下一行执行相同操作。每行最多需要n(n + 1)/ 2次比较,这并不是很好。因此,如果n是列数,m是行数,则会运行,最差情况为m(n(n + 1)/ 2)次。
以下是它如何适用于行的示例:
/**
* Return flag indicating if there are duplicates in the rows of the 2D array
*
* @return true if a row has duplicates, else false
*/
public boolean hasDuplicatesInRows(int[][] inArray)
{
for (int row = 0; row < inArray.length; row++)
{
for (int col = 0; col < inArray[row].length; col++)
{
int num = inArray[row][col];
for (int otherCol = col + 1; otherCol < inArray.length; otherCol++)
{
if (num == inArray[row][otherCol])
{
return true;
}
}
}
}
return false;
}
这也很容易扩展到列。我会留下那个让你做的。
如果您使用了有效的排序方法并对所有行进行了排序,您可以直接查看该行,看看是否有任何值等于它之后的值。如果是,则返回true,否则返回false。如果您拥有大型数据集,这将更有效。
答案 2 :(得分:1)
假设您创建了一个在一维数组上运行的方法。您可以解决问题,将二维数组中的数字条带提取为一维数组。它的签名可能看起来像boolean containsDupes(int[] strip) { ... }
。
该方法中有几种方法可以使解决更容易。一种方法是对该数组进行排序,以使这些数据彼此相邻。另一种方法是使用每个值填充HashSet,并将Set的大小与数组的长度进行比较。
答案 3 :(得分:1)
实现此任务的一种更紧凑的方法是将所有值添加到Set中,然后使用guava将Set中的唯一元素数与原始行大小进行比较。
public static boolean hasDuplicates(int [][] inArray) {
for (int row = 0; row < inArray.length; row++) {
int curRow = inArray[row];
Set set = Sets.newHashSet(Arrays.asList(curRow));
if (set.size() < curRow.length) {
return true;
}
}
return false;
}