假设有两个整数数组nums和numsCopy,例如:
int[] nums = {2,5,3,8,6,10}
int[] numsCopy = {2,3,5,6,8,10}
我想比较两个数组并找出第一个和最后一个不同的整数并记录它们的位置然后计算长度,这是最好的方法吗? 使用java。
答案 0 :(得分:0)
如果两个数组的大小相同,则可以使用两个for循环。一个从最开始的一个开始:
int start;
for (start = 0; start < nums.length; start++) {
if (nums[start] != numsCopy[start])
break;
}
if (start == nums.length)
return; // there are no different entries
int end;
for (end = nums.length - 1; end >= 0; end--) {
if (nums[end] != numsCopy[end])
break;
}
// the distance of the first to the last entry
int dist = end - start;
// the count of elements in the rang from first to last
int count = dist + 1;
如果两个数组没有差异,此代码将在return
的早期退出。如果只有一个差异,count
将为1
。在您的示例中,count
将为4
。通常,count
介于1
和nums.length
之间。
这是一个紧凑的(可能更高效)版本,它使用while循环并减少评论中建议的 greybeard 等测试次数。结果(早期退出或count
中的值)与上述更详细的版本完全相同。
int start = 0;
while (nums[start] == numsCopy[start]) {
if (++start == nums.length)
return; // there are no different entries
}
int end = nums.length - 1;
while (nums[end] == numsCopy[end]) end--;
int count = end - start + 1;
答案 1 :(得分:0)
当然,最好的方法是使用两次迭代。正如@greybeard所说,我们真的很想知道使用两次迭代有什么问题。
尽管如此,要回答这个问题,一种可能的方法(绝不是最好的方法),不使用两个for
循环等,就是将任务委托给Java9流API:
if (nums.length != numsCopy.length)
throw new IllegalArgumentException("Arrays are not the same length");
IntPredicate elementsEqual = i -> nums[i] == numsCopy[i];
int first = IntStream.range(0, nums.length)
.dropWhile(elementsEqual)
.findFirst()
.getAsInt();
int last = IntStream.iterate(nums.length - 1, i -> i >= first, i -> i - 1)
.dropWhile(elementsEqual)
.findFirst()
.getAsInt();
int count = last - first + 1;
如果没有找到差异,则抛出NoSuchElementException
。
如果您想要的只是差异子序列的长度,您可以在一个流语句中执行此操作:
long length = IntStream.iterate(nums.length - 1, i -> i >= 0, i -> i - 1)
.dropWhile(elementsEqual)
.limit(1)
.flatMap(end -> IntStream.rangeClosed(0, end))
.dropWhile(elementsEqual)
.count();
返回所需子序列的长度,如果数组匹配则返回0。
答案 2 :(得分:-1)
1)获取第一个数组的大小。 2)获取第二阵列的大小。 3)运行最小的两个循环。 4)比较每个数组存储结果。