• 笔试题&面试题


    1.问题:写出一个算法,对给定的n个数的序列,返回序列中的最大和最小的数. 设计出一个算法,只需要执行1.5n次比较就能找到序列中最大和最小的数吗?能否再少?

    解析:要求比较次数为1.5n,使用一般的逐个遍历每个元素然后判断其是否为最大最小值是需要2n次的比较的,所以这样的方法是行不通的。现在考虑采用,每次从数组中取出两个元素,判断其大小,然后再分别判断其是否是最大或最小值,这样一次处理两个元素,每一次比较3次,最终的比较次数就是n/2*3=1.5n。

    2.问题:一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3

    解析:(拿sum去试探加每个元素)sum帮我将数组中元素一个一个加,每累加一次如果大于之前max,就将max更新为sum,否则max继续保持原来的值,sum继续找,直到完。

    3.问题:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

    解析:
    • 题目是要求nums中有两个数和是target,那么就应该是nums中会存在一个target - nums[i]的数,这种变换思维是要具备,即当题目需要得到什么结果,将这个结果推到出等价的描述,得到一些充分条件或者必要条件,在想办法(算法)去得到这些条件,当然也要具备一些基础知识,比如hash思想,知道hash方法它有哪些应用场景和它还有可能解决什么问题。
    • 题目转换为nums中找到一个target - nums[i]的数,那么可以先得到这些target - nums[i],即得到两个nums.length大小的数组,再去找到两个数组中相同的数,找到相同的数,最容易的方法就是通过hash思想,有很多类似找相同数或者元素都有借助hash思想。
    • coding:
    • def handle(arr, target):
          dict1 = {}  # 保存数值及对应的索引
          res = []    # 返回结果
      
          for i in range(len(arr)):
              # 另外一个值
              num = target - arr[i]
              # 如果这个数不在字典里,保存起来;在字典里,返回
              if num not in dict1:
                  dict1[arr[i]] = i
              else:
                  res.append([dict1[num], i])
          return res
      
      if __name__ == '__main__':
          res = handle([1,2,3,4,5], 6)
          print(res)
  • 相关阅读:
    MVC4.0系统开发新手历程1
    hdu1205(类似 分布垃圾数列)
    python manage.py startapp app 时候报错No module named _sqlite3
    delphi 文件夹权限设置(执行一个小脚本的笨办法)
    FreeBSD 10安装KDE桌面环境简介(亲测bsdconfig命令有效)
    Qt的目录依赖问题----怎样生成一个绿色的Qt软件包
    Qt5位置相关函数异同详解(附源码)
    Qt 设置背景图片3种方法(三种方法:QPalette调色板,paintEvent,QSS)
    简单实现android和wp聊天
    进程间通讯之mmap文件共享
  • 原文地址:https://www.cnblogs.com/demo-deng/p/13332819.html
Copyright © 2020-2023  润新知