剑指Offer JZ37 Python Solution

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

http://www.nowcoder.com/questionTerminal/70610bf967994b22bb1c26f9ae901fa2

暴力解法

  • 遍历数组
    # -*- coding:utf-8 -*-
    class Solution:
      def GetNumberOfK(self, data, k):
          # write code here
          cnt = 0
          for i in range(0,len(data)):
              if data[i] == k :
                  cnt = cnt + 1
          return cnt

基于二分搜索算法的优化解法 (cite 剑指Offer)

  • 利用非降序数组的特点简化二分搜索算法
    查找第一个与最后一个出现的数字k
    第一个数字k查找方法
    二分查找得到中间数字,若中间数字为k,判断中间数字的前一个数字,若前一个数字值小与k,利用数组非降序的特点,中间数字为第一个出现的k;若前一个数字值等于k,则第一个出现的数字出现在中间数字前,利用递归,寻找第一个出现的数字k。
    最后一个数字k查找方法
    中间数字若等于k,判断中间数字的后一个数字,若后一个数字值大于k,则中间数字为最后一个出现的k;若后一个数字等于k,则最后一个出现的数字出现在中间数字后,利用递归,寻找最后一个出现的数字k。
    特殊情况的处理
    数组index越界
  • 功能测试(空数组,数组中无查找数字,查找数字在数组中出现一次/多次)
  • 对于边界值测试用例的处理(数组中只有一个元素)
  • Python Class Method
class Solution:
    def __init__(self):
        self.cnt = 0 
    def GetNumberOfK(self, data, k):
        # special case
        if len(data) == 0:
            return 0
        if len(data) == 1:
            if data[0] == k:
                return 1
            else:
                return 0

        start_index = 0
        end_index = len(data)-1
        # get the first_index of searched item k
        first_index = self.GetFirstK(data,k,start_index,end_index)
        print('first_index = '+ str(first_index))
        # get the last_index of searched item k 
        last_index = self.GetLastK(data,k,start_index,end_index)
        print('last_index = '+ str(last_index))

        return last_index - first_index + 1

    def GetFirstK(self, data, k, start_index, end_index):

        mid_index = int((start_index + end_index)/2)

        if mid_index == start_index:
            if data[mid_index] == k:
                return mid_index
            else:
                return -1


        if data[mid_index] == k:
            if data[mid_index-1] != k:
                return mid_index
            else:
                return self.GetFirstK(data, k, start_index, mid_index-1)
        elif data[mid_index] > k:
            return self.GetFirstK(data, k, start_index, mid_index-1)
        else:
            return self.GetFirstK(data, k, mid_index+1, end_index)


    def GetLastK(self, data, k, start_index, end_index):

        mid_index = int((start_index + end_index)/2)

        if mid_index == end_index:
            if data[mid_index] == k:
                return end_index
            else:
                return -2

        if data[mid_index] == k:
            if data[mid_index+1] != k:
                return mid_index
            else:
                return self.GetLastK(data, k, mid_index+1, end_index)
        elif data[mid_index] > k:
            return self.GetLastK(data, k, start_index, mid_index-1)
        else:
            return self.GetLastK(data, k, mid_index+1, end_index)
全部评论

相关推荐

行云流水1971:这份实习简历的优化建议: 结构清晰化:拆分 “校园经历”“实习经历” 板块(当前内容混杂),按 “实习→校园→技能” 逻辑排版,求职意向明确为具体岗位(如 “市场 / 运营实习生”)。 经历具象化:现有描述偏流程,需补充 “动作 + 数据”,比如校园活动 “负责宣传” 可加 “运营公众号发布 5 篇推文,阅读量超 2000+,带动 300 + 人参与”;实习内容补充 “协助完成 XX 任务,效率提升 X%”。 岗位匹配度:锚定目标岗位能力,比如申请运营岗,突出 “内容编辑、活动执行” 相关动作;申请市场岗,强化 “资源对接、数据统计” 细节。 信息精简:删减冗余表述(如重复的 “负责”),用短句分点,比如 “策划校园招聘会:联系 10 + 企业,组织 200 + 学生参与,到场率达 85%”。 技能落地:将 “Office、PS” 绑定经历,比如 “用 Excel 整理活动数据,输出 3 份分析表;用 PS 设计 2 张活动海报”,避免技能单独罗列。 优化后需强化 “经历 - 能力 - 岗位需求” 的关联,让实习 / 校园经历的价值更直观。 若需要进一步优化服务,私信
实习,投递多份简历没人回...
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务