zoukankan      html  css  js  c++  java
  • 关于算法

    面试题

    def num():
             return [lambda x: i*x for i in range(4)]
    print([m(2) for m in num()])     # 输出: [6, 6, 6, 6]

    思路:

    这题涉及到了闭包延时绑定,当循环执行完了之后才会执行传参,循环四次,每一次循环完 i=3 然后再和x相乘 所以结果是6,6,6,6。 如果把 [ lambda x: ix for i in range(4) ] 改成 ( lambda x: ix for i in range(4) )这样就变成了一个生成器 自动实现迭代器协议,一边循环一边计算的机制, 这样结果就是 0,2,4,6.


    两数之和

    给定 nums = [2, 7, 11, 15], target = 9
    因为 nums[0] + nums[1] = 2 + 7 = 9
    所以返回 [0, 1]

    思路:

    这里可以使用字典来解题,通过enumerate方法遍历获取数据的下标包括对应值,然后以key,value形式把该数据的下标和对应值存入字典,然后再出通过enumerate方法遍历数据,每一次获取数据就从字典拿出一个值,用目标值减去从字典拿出的这个值得到一个结果值,如果结果值存在字典当中,那么返回两个数的下标,如果为None,说明字典中没有这个值。

    实现代码:

    def get_index_list(nums, target):

       # Todo 作为一个方法来实现,批量解决这个获取索引的问题
       """
      :params nums:传的参数的列表
      :params target: 目标值
      :return: 返回索引
      """

       dic = {}

       for a, b in enumerate(nums):  # a是下标 b是对应值

           dic[b] = a  # 对应值存入字典

       for i, b in enumerate(nums):

           j = dic.get(target-b)  # 从字典中拿出对应值 用目标值减去对应值

           if j is not None:  # 判断如果减去的对应值不为空,则返回下标

               return [i, j]

    数组中重复的数字

    示例:

    输入:
    [2,3,1,0,2,5,3]
    输出: 2 3

    思路:

    这道题想到的是,使用列表中的count方法,定义一个空列表,遍历数据然后进行判断,如果数据值出现个数大于或等于2,说明该数据是重复的,然后把重复的筛取出来之后存入空列表,再进行返回输出。

    实现代码:

    def get_number(nums):
       """
      :params nums:传的参数的数组
      :return: 返回重复数字
      """
       nub = []

       for i in nums:
           if nums.count(i) >= 2:
               if str(i) not in nub:
                   nub.append(str(i))

       print('或'.join(nub))


    if __name__ == "__main__":
       get_number([2, 3, 1, 0, 2, 5, 3])

    队列实现一个栈

    思路:

    使用一个队列,实现栈的一些基本操作,栈(后进先出)的特性。

    实现代码:

    # 队列实现一个栈 (栈:后进先出)
    class Stack(object):

       def __init__(self):
           # 定义一个队列
           self.lst = []

       def is_None(self):
           # 判断栈是否为空 返回 ture false
           return self.lst == []

       def push(self, i):
           # 加入元素
           self.lst.append(i)

       def pop(self):
           # 出栈
           return self.lst.pop()

       def stack_top(self):
           # 返回栈顶元素
           return self.lst[-1]

       def size(self):
           # 栈的大小
           return len(self.lst)


    if __name__ == "__main__":

       stack = Stack()
       print(stack.is_None())
       stack.push(1)
       stack.push(2)
       stack.push(3)
       print(stack.lst)
       print(stack.pop())
       print(stack.stack_top())
       print(stack.size())

     

    回文数

    判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

    示例1:

    输入: 121
    输出: true

    示例2:

    输入: -121
    输出: false
    解释: 从左向右,为 -121 从右向左读,为121- 因此它不是一个回文数

    示例3:

    输入: 10
    输出: false
    解释: 从右向左读,为 01 。 因此它不是一个回文数

    思路:

    这题可以使用字符串 双指针的方法 将数据转化为字符串 首先定义好第一个元素下标和最后一个元素下标,while循环 只要条件不满足 一直循环 循环判断第一个和最后一个元素是否相等 不相等返回false 相等继续循环,如果循环条件满足之后都相等,返回 false

    实现代码:

    def palindromic_number(x):

       """
      :params x:传的参数的列表
      :return: 返回Ture False
      """

       lst = list(str(x))
       print(lst)
       L, R = 0, len(lst)-1

       while L <= R:
           print(L, R)
           if lst[L] != lst[R]:
               return False

           L += 1
           R -= 1
       return True


    if __name__ == "__main__":
       print(palindromic_number(1231))

    分别用生成器和迭代器生成斐波那契数列

    示例:

    输出: 1 1 2 3 5 8 13
    # 使用迭代器生成斐波那契数列
    class Fibonacii(object):
       def __init__(self,all_num):
           self.all_num = all_num
           self.cur_idx = 0
           self.a = 0  
           self.b = 1
       
       def __iter__(self):
           return self
       
       def __next__(self):
           if self.cur_idx >= self.all_num:
               raise StopIteration
           ret = self.a
           
           self.a, self.b = self.b, self.a + self.b
           self.cur_idx += 1
           return ret

    fibo = Fibonacii(10)
    for i in fibo:
       print(i)
    # 使用生成器生成斐波那契数列
    def fibnacii(count):
       num = 0
       a, b = 0, 1
       while num < count:
           yield a
           a, b = b, a+b
           num += 1


    fi = fibnacii(10)
    for i in fi:
       print(i)

    反转字符数组

    思路:

    直接使用反转

    实现代码:

    # 反转字符串
    def reverseString(s):
       s[0::] = s[::-1]
       print(s)


    if __name__ == "__main__":
       reverseString(['b', '', 'a', 'r'])


     
    # 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
    # 思路
    # 根据题意, 需要计算10次反弹的距离, 所以进行循环10次, 但是第一次他是直接落下去距离为100米,如果他是第一次落下去就把第一次距离添加到
    # 列表中, 因为落下去弹回来是之前距离的一半, 所以需要除以二来计算距离, 知道循环结束, 然后统计10次的总和, 此时height的高度为第10次的高度

    def ballBounce():

    height = 100
    ball_bounce = []
    # num = 0
    # while num < 10:
    # if num == 0:
    # ball_bounce.append(height)
    # else:
    # ball_bounce.append(height*2)
    # height = height / 2
    # num += 1
    # return sum(ball_bounce), height
    for i in range(10):
    if i == 0:
    ball_bounce.append(height)
    else:
    ball_bounce.append(height*2)
    height = height / 2
    print(sum(ball_bounce))
    print(height)


    # if __name__ == '__main__':
    # ballBounce()
    # print(ballBounce())



    # 冒泡排序
    def bubbleSort(arr):
    n = len(arr)
    # 遍历所有数组元素
    for i in range(n):
    for j in range(0, n - i - 1):
    if arr[j] > arr[j + 1]:
    arr[j], arr[j + 1] = arr[j + 1], arr[j]
    return arr

    arr = [64, 34, 25, 12, 22, 11, 90]
    if __name__ == '__main__':

    bubbleSort(arr)
    print(arr)
    for i in arr:
    print(i)



    # "Let's take LeetCode contest"
    # 输出: "s'teL ekat edoCteeL tsetnoc"

    # 思路
    # 先把字符串按照空格切割(字符串切割后变成列表),把切割后的列表进行反转 输出 ['contest', 'LeetCode', 'take', "Let's"] 类型为list
    # 反转后的列表按照空格进行拼接, 然后进行反转 输出 s'teL ekat edoCteeL tsetnoc

    s = "Let's take LeetCode contest"
    a = s.split(' ')[::-1]
    b = ' '.join(a)
    c = b[::-1]
    print(a)
    print(b)
    print(c)
    #
    # def reverseStr(s):
    # return ' '.join(s.split(' ')[::-1])[::-1]
    # if __name__ == '__main__':
    # print(reverseStr(s))




     

     

     

     

     

     

  • 相关阅读:
    CSS------添加注释框
    MyEclipse------制作通讯录
    JavaScript------入门
    JSTL标签库简介
    过滤器在Web开发应用------解决中文乱码
    Servlet------(声明式)异常处理
    电脑环境变量里面的参数
    MyEclipse------黑科技
    MyEclipse------从MySQL取出图片
    MyEclipse------带进度条的输入流
  • 原文地址:https://www.cnblogs.com/Liu-Hui/p/13254165.html
Copyright © 2011-2022 走看看