思路和代码如下:仅供学习,牛客网回复也属于本人,不是抄袭!
1 首先题目限定了使用二分查找法
2 可能出现重复,但是想一下,如果出现了重复,如果是出现再后面,肯定不用考虑,因为执行过程中会忽略,但是出现再前面,返回的索引就不对了,因此再找的得到元素的基础上,要再一个查询条件,查找前面是否存在重复,有则返回
3 查不到元素,树立一个标志位 count ,查到致1,未查到就是0,返回时候判断标志位
4 以下是通过的代码 Python 2.7.3
5 对于split划分,形成列表,列表元素是字符类型,因此在索引的时候需要转型,这个在线编程里面的一个小细节,注意一下。
题目描述
对于一个有序数组,我们通常采用二分查找的方式来定位某一元素,请编写二分查找的算法,在数组中查找指定元素。
给定一个整数数组A及它的大小n,同时给定要查找的元素val,请返回它在数组中的位置(从0开始),若不存在该元素,返回-1。若该元素出现多次,请返回第一次出现的位置。
测试样例:
[1,3,5,7,9],5,3
返回:1
代码:
import sys
class BinarySearch:
def getPos(self, A, n, val):
arr = A
num = n
ele = val
org = 0
end = len(arr)-1
count = 0
while org <= end:
mid = int((org + end)/2)
if arr[mid] == ele:
count = 1
break
elif ele > arr[mid]:
org = mid + 1
elif ele <arr[mid]:
end = mid -1
if count == 1:
for i in A[:int((len(A)-1)/2)]:
if i == val:
return A.index(i)
else:
return mid
else:
return -1
if __name__ == '__main__':
class_org = BinarySearch()
data = sys.stdin.readline().strip().split(',')
A = data[0]
n = int(data[1])
val = int(data[2])
count = class_org.getPos(A,n,val)