牛客-数组

1、最大公约数

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 求出a、b的最大公约数。
# @param a int 
# @param b int 
# @return int
#
class Solution:
    def gcd(self , a , b ):
        # write code her
        if b == 0:
            return a
        else:
            return self.gcd(b, a%b)

2、数字在升序数组中出现的次数

解题思路:1、遍历data,若有和k一样的数,num加一。
2、python中现成函数

# -*- coding:utf-8 -*-
class Solution:
    def GetNumberOfK(self, data, k):
        # write code here
        num = 0
        for i in data:
            if i == k:
                num += 1
        return num
# -*- coding:utf-8 -*-
class Solution:
    def GetNumberOfK(self, data, k):
        # write code here
        return data.count(k)

3、二维数组中的查找

解题思路:从数组的右上角开始查找,若右上角的数大于target,则排除当前列,否则排除当前行。

class Solution:
    def Find(self , target: int, array: List[List[int]]) -> bool:
        # write code here
        rows = len(array)
        cols = len(array[0])
        if rows> 0 and cols > 0:
            row = 0
            col = cols - 1
            while row < rows and col >= 0:
                if target == array[row][col]:
                    return True
                elif target>array[row][col]:
                    row += 1
                else:
                    col -= 1
        return False

4、数组中重复的元素

解题思路:首先数组的长度是为n,取值范围0n-1,与此对应下标也是0n-1,若数组不包含重读元素,那么numbers[i] = i。若包含重复元素,那么一个元素可能包含多个下标,所以方法是对数组遍历,判断numbers[i] 和 i是否相等,若不等,则判断numbers[numbers[i]]和numbers[i],若相等,则返回numbers[i],若不等则交换,然后一直遍历。直到numbers[numbers[i]]和numbers[i]相等。

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param numbers int整型一维数组 
# @return int整型
#
class Solution:
    def duplicate(self , numbers ):
        # write code here
        n = len(numbers)
        for i in range(n):
            while numbers[i] != i:
                j = numbers[i]
                if numbers[j] == j:
                    return j
                else:
                    numbers[i] = numbers[j]
                    numbers[j] = j
        return -1

5、旋转数组的最小数字

解题思路:二分法

# -*- coding:utf-8 -*-
class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        left = 0
        right = len(rotateArray)-1
        while left < right:
            mid = (left+right)//2
            if rotateArray[mid] < rotateArray[right]:
                right = mid
            else:
                left = mid+1
            if rotateArray[mid] == rotateArray[right]:
                return self.minInorder(rotateArray, left, right)
        return rotateArray[left]
    def minInorder(self,array,left,right):
        result = array[left]
        for i in range(right+1):
            if array[i]<result:
                result = array[i]
        return result

6、数组中出现次数超过一半的数

解题思路:摩尔投票

# -*- coding:utf-8 -*-
class Solution:
    def MoreThanHalfNum_Solution(self, numbers):
        # write code here
        rate = 0
        for i in numbers:
            if rate == 0:
                res = i
            if res == i:
                rate += 1
            else:
                rate -=1
        return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值