1.数字在升序数组中出现的次数
class Solution:
def GetNumberOfK(self , data: List[int], k: int) -> int:
# write code here
# 两个指针,由于列表为升序,因此可以使用二分法,保证时间复杂度为nlogn
# 每次都以中间数判断,以缩小寻找范围
# 最后把两个指针分别指向要寻找的数的左右index
left = 0
right = len(data)-1
while left <= right:
mid = int((right+left)/2)
if k < data[mid]:
right = mid - 1
continue
elif k > data[mid]:
left = mid + 1
continue
else:
while data[left] < k:
left += 1
while data[right] > k:
right -= 1
return right-left+1
return 0
# 最笨的方法,代码量大,没有用指针,只用了一个值用来保存
if not data or k > data[-1] or k < data[0]:
return 0
if len(data) == 1 and k == data[0]:
return 1
if len(data) == 1 and k != data[0]:
return 0
result = 0
while len(data) > 1:
lenght = int(len(data)/2)
if k < data[lenght]:
data = data[:lenght]
elif k > data[lenght]:
data = data[lenght:]
elif k == data[lenght]:
result += 1
len_1 = lenght - 1
lenght += 1
while data[len_1] == k:
result += 1
if len_1 > 0:
len_1=len_1-1
else:
break
while data[lenght] == k:
result += 1
if lenght<len(data)-1:
lenght=lenght+1
else:
break
return result
return 0
2.旋转数组的最小数字
class Solution:
def minNumberInRotateArray(self , rotateArray: List[int]) -> int:
# write code here
# 将右端点作为比较的目标值,根据旋转数组的特点可以改变left和right指针的位置
# 要注意一个情况需要left = mid + 1,一个情况需要right = mid,可以举例【3,4,5,1,2】且分别以5和1作为例子
# 切记不能以左端点为比较目标,举例【1,2,3,4,5】
left = 0
right = len(rotateArray) - 1
while left < right:
mid = int((right+left)/2)
if rotateArray[mid] > rotateArray[right]:
left = mid + 1
continue
elif rotateArray[mid] < rotateArray[right]:
right = mid
continue
else:
right -= 1
continue
return rotateArray[left]
3. 数字序列中某一位的数字
class Solution:
def findNthDigit(self , n: int) -> int:
# write code here
# 各个区间的下限上限是[0,10),[10, 100),[100,1000)...位数是1,2,3...
# 从第1个区间的上限开始进行比较,如果大于上限,将上下限*10,将n=n-(上限-下限)*位数 直至找到n所在的区间
# 找到区间后,n/位数 找到所在的数字,然后n%位数,找到数字的第几位数字
weishu = 1
bottom, top = 0, 10
while n > (top-bottom)*weishu:
n -= (top-bottom)*weishu
bottom, top = top, top*10
weishu += 1
num, r = divmod(n, weishu)
return int(str(num+bottom)[r])