【发布时间】:2020-12-02 16:16:48
【问题描述】:
一种接收数组的方法,该数组是未排序的,由一对相邻的相等数字以及恰好一个没有一对的数字组成。比如——
int [] a = {6,6,18,18,-4,-4,12,9,9};
int [] c = {8,-7,-7,3,3,0,0,10,10,5,5,4,4};
代码必须返回索引和数字本身。
现在的问题是关于时间复杂度的问题,我知道可以通过 O(logn) 来解决这个问题,但我的代码一半有效:
public static int findSingle (int [] a) {
int high = a.length-1;
int low = 0;
int mid = 0;
int found = 0;
mid = ((high-low)/2);
while (mid >= 1) {
if (a[mid] != a[mid-1])
low = mid +1;
mid =((high - low)/2);
if (mid == 1)
found = a[mid];
if (a[mid] == a[mid-1])
high = mid-1;
mid = ((high - low)/2);
}
return found;
}
现在给定这个数组:
int [] d = {8,8,-7,3,3,0,0,10,10,5,5,4,4};
它说数字在第8个元素,这显然不是真的,在某些数组中它也会出错。有什么问题?
编辑:我注意到我应该将“中”指定为高 + 低/2,但无论如何都不能解决问题。
【问题讨论】:
-
在这种情况下,您可以对未排序的数组使用二进制搜索,但此代码中存在一些明显的错误。我正在寻找答案。
-
dbl,我说的指令是在数组中找到唯一的数字,时间复杂度为logn。 ThisIsAQuestion,谢谢。
-
当您说“which is unsorted”时,您的意思是 all 条目可能未排序(例如,
{3,1,-2,-2,1,99,3}是可能的),或者那——就像你的例子一样——这些对是总是相邻的,是pairs是未排序的? -
@TripeHound,数组总是有对,而且它们总是彼此靠近。例如,{4,4,-2,-2,5} 可行,但 {4,5,4,-2,-2} 不可行。
-
你需要找到那个号码的号码和索引,哪个没有配对条目?